On Thu, 22 Nov 2018 13:48:18 +0000
James Kerwin <jkerwin2...@gmail.com> wrote:

> Hi All,
> 
> I'm looking through some Perl files for software we use and I noticed
> this in one of the config files:
> 
> $c->{guess_doc_type} ||= sub {
> 
> All other similar config files show a similar structure, but without
> the "||" before the equals sign:
> 
> $c->{validate_document} = sub {
> 
> My question is, what is the "||" doing in the first example?

"||=" is the conditional assignment operator - it assigns the value on
the right-hand side to the thing on the left hand side, *but* only if
the thing on the left hand side doesn't evaluate to a true value.

For instance,

  my $foo;
  $foo ||= "Bar";
  # $foo is now "Bar" - because it wasn't true before
  $foo ||= "Baz";
  # $foo is still "Bar" - it wasn't changed

In your example, the value on the right hand side is a coderef = so, if
$c->{guess_doc_type} didn't already contain something truthy, then it
will be set to a coderef defined by the sub { ... } block.

See also "//=", the defined-or operator, which works in pretty much the
same way, but checking for definedness - the difference being that if
the left hand side contained something that wasn't a truthy value, ||=
would overwrite it, whereas //= wouldn't.

You'll often see these operators used to provide default values.

e.g.

  sub hello {
      my $name = shift;
      $name ||= 'Anonymous Person';
      return "Hi there, $name!";
  }


> I've attempted to Google this, but found no solid answer.

Yeah, Googling for operators when you don't know their name is rarely
useful :)  Perl's operators are all documented quite well at:

https://perldoc.perl.org/perlop.html

I do notice that there isn't actually a very useful section on ||=
and //= - I may try to raise a pull requests to add more documentation
on them.

Cheers

Dave P

-- 
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to