diff options
Diffstat (limited to 'upstream/debian-bookworm/man1/perlsyn.1')
-rw-r--r-- | upstream/debian-bookworm/man1/perlsyn.1 | 1645 |
1 files changed, 1645 insertions, 0 deletions
diff --git a/upstream/debian-bookworm/man1/perlsyn.1 b/upstream/debian-bookworm/man1/perlsyn.1 new file mode 100644 index 00000000..eae2b0cc --- /dev/null +++ b/upstream/debian-bookworm/man1/perlsyn.1 @@ -0,0 +1,1645 @@ +.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.43) +.\" +.\" Standard preamble: +.\" ======================================================================== +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Vb \" Begin verbatim text +.ft CW +.nf +.ne \\$1 +.. +.de Ve \" End verbatim text +.ft R +.fi +.. +.\" Set up some character translations and predefined strings. \*(-- will +.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left +.\" double quote, and \*(R" will give a right double quote. \*(C+ will +.\" give a nicer C++. Capital omega is used to do unbreakable dashes and +.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, +.\" nothing in troff, for use with C<>. +.tr \(*W- +.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +.ie n \{\ +. ds -- \(*W- +. ds PI pi +. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +. ds L" "" +. ds R" "" +. ds C` "" +. ds C' "" +'br\} +.el\{\ +. ds -- \|\(em\| +. ds PI \(*p +. ds L" `` +. ds R" '' +. ds C` +. ds C' +'br\} +.\" +.\" Escape single quotes in literal strings from groff's Unicode transform. +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" +.\" If the F register is >0, we'll generate index entries on stderr for +.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +.\" entries marked with X<> in POD. Of course, you'll have to process the +.\" output yourself in some meaningful fashion. +.\" +.\" Avoid warning from groff about undefined register 'F'. +.de IX +.. +.nr rF 0 +.if \n(.g .if rF .nr rF 1 +.if (\n(rF:(\n(.g==0)) \{\ +. if \nF \{\ +. de IX +. tm Index:\\$1\t\\n%\t"\\$2" +.. +. if !\nF==2 \{\ +. nr % 0 +. nr F 2 +. \} +. \} +.\} +.rr rF +.\" ======================================================================== +.\" +.IX Title "PERLSYN 1" +.TH PERLSYN 1 "2023-11-25" "perl v5.36.0" "Perl Programmers Reference Guide" +.\" For nroff, turn off justification. Always turn off hyphenation; it makes +.\" way too many mistakes in technical documents. +.if n .ad l +.nh +.SH "NAME" +perlsyn \- Perl syntax +.IX Xref "syntax" +.SH "DESCRIPTION" +.IX Header "DESCRIPTION" +A Perl program consists of a sequence of declarations and statements +which run from the top to the bottom. Loops, subroutines, and other +control structures allow you to jump around within the code. +.PP +Perl is a \fBfree-form\fR language: you can format and indent it however +you like. Whitespace serves mostly to separate tokens, unlike +languages like Python where it is an important part of the syntax, +or Fortran where it is immaterial. +.PP +Many of Perl's syntactic elements are \fBoptional\fR. Rather than +requiring you to put parentheses around every function call and +declare every variable, you can often leave such explicit elements off +and Perl will figure out what you meant. This is known as \fBDo What I +Mean\fR, abbreviated \fB\s-1DWIM\s0\fR. It allows programmers to be \fBlazy\fR and to +code in a style with which they are comfortable. +.PP +Perl \fBborrows syntax\fR and concepts from many languages: awk, sed, C, +Bourne Shell, Smalltalk, Lisp and even English. Other +languages have borrowed syntax from Perl, particularly its regular +expression extensions. So if you have programmed in another language +you will see familiar pieces in Perl. They often work the same, but +see perltrap for information about how they differ. +.SS "Declarations" +.IX Xref "declaration undef undefined uninitialized" +.IX Subsection "Declarations" +The only things you need to declare in Perl are report formats and +subroutines (and sometimes not even subroutines). A scalar variable holds +the undefined value (\f(CW\*(C`undef\*(C'\fR) until it has been assigned a defined +value, which is anything other than \f(CW\*(C`undef\*(C'\fR. When used as a number, +\&\f(CW\*(C`undef\*(C'\fR is treated as \f(CW0\fR; when used as a string, it is treated as +the empty string, \f(CW""\fR; and when used as a reference that isn't being +assigned to, it is treated as an error. If you enable warnings, +you'll be notified of an uninitialized value whenever you treat +\&\f(CW\*(C`undef\*(C'\fR as a string or a number. Well, usually. Boolean contexts, +such as: +.PP +.Vb 1 +\& if ($a) {} +.Ve +.PP +are exempt from warnings (because they care about truth rather than +definedness). Operators such as \f(CW\*(C`++\*(C'\fR, \f(CW\*(C`\-\-\*(C'\fR, \f(CW\*(C`+=\*(C'\fR, +\&\f(CW\*(C`\-=\*(C'\fR, and \f(CW\*(C`.=\*(C'\fR, that operate on undefined variables such as: +.PP +.Vb 2 +\& undef $a; +\& $a++; +.Ve +.PP +are also always exempt from such warnings. +.PP +A declaration can be put anywhere a statement can, but has no effect on +the execution of the primary sequence of statements: declarations all +take effect at compile time. All declarations are typically put at +the beginning or the end of the script. However, if you're using +lexically-scoped private variables created with \f(CW\*(C`my()\*(C'\fR, +\&\f(CW\*(C`state()\*(C'\fR, or \f(CW\*(C`our()\*(C'\fR, you'll have to make sure +your format or subroutine definition is within the same block scope +as the my if you expect to be able to access those private variables. +.PP +Declaring a subroutine allows a subroutine name to be used as if it were a +list operator from that point forward in the program. You can declare a +subroutine without defining it by saying \f(CW\*(C`sub name\*(C'\fR, thus: +.IX Xref "subroutine, declaration" +.PP +.Vb 2 +\& sub myname; +\& $me = myname $0 or die "can\*(Aqt get myname"; +.Ve +.PP +A bare declaration like that declares the function to be a list operator, +not a unary operator, so you have to be careful to use parentheses (or +\&\f(CW\*(C`or\*(C'\fR instead of \f(CW\*(C`||\*(C'\fR.) The \f(CW\*(C`||\*(C'\fR operator binds too tightly to use after +list operators; it becomes part of the last element. You can always use +parentheses around the list operators arguments to turn the list operator +back into something that behaves more like a function call. Alternatively, +you can use the prototype \f(CW\*(C`($)\*(C'\fR to turn the subroutine into a unary +operator: +.PP +.Vb 2 +\& sub myname ($); +\& $me = myname $0 || die "can\*(Aqt get myname"; +.Ve +.PP +That now parses as you'd expect, but you still ought to get in the habit of +using parentheses in that situation. For more on prototypes, see +perlsub. +.PP +Subroutines declarations can also be loaded up with the \f(CW\*(C`require\*(C'\fR statement +or both loaded and imported into your namespace with a \f(CW\*(C`use\*(C'\fR statement. +See perlmod for details on this. +.PP +A statement sequence may contain declarations of lexically-scoped +variables, but apart from declaring a variable name, the declaration acts +like an ordinary statement, and is elaborated within the sequence of +statements as if it were an ordinary statement. That means it actually +has both compile-time and run-time effects. +.SS "Comments" +.IX Xref "comment #" +.IX Subsection "Comments" +Text from a \f(CW"#"\fR character until the end of the line is a comment, +and is ignored. Exceptions include \f(CW"#"\fR inside a string or regular +expression. +.SS "Simple Statements" +.IX Xref "statement semicolon expression ;" +.IX Subsection "Simple Statements" +The only kind of simple statement is an expression evaluated for its +side-effects. Every simple statement must be terminated with a +semicolon, unless it is the final statement in a block, in which case +the semicolon is optional. But put the semicolon in anyway if the +block takes up more than one line, because you may eventually add +another line. Note that there are operators like \f(CW\*(C`eval {}\*(C'\fR, \f(CW\*(C`sub {}\*(C'\fR, and +\&\f(CW\*(C`do {}\*(C'\fR that \fIlook\fR like compound statements, but aren't\*(--they're just +TERMs in an expression\*(--and thus need an explicit termination when used +as the last item in a statement. +.SS "Statement Modifiers" +.IX Xref "statement modifier modifier if unless while until when foreach for" +.IX Subsection "Statement Modifiers" +Any simple statement may optionally be followed by a \fI\s-1SINGLE\s0\fR modifier, +just before the terminating semicolon (or block ending). The possible +modifiers are: +.PP +.Vb 7 +\& if EXPR +\& unless EXPR +\& while EXPR +\& until EXPR +\& for LIST +\& foreach LIST +\& when EXPR +.Ve +.PP +The \f(CW\*(C`EXPR\*(C'\fR following the modifier is referred to as the \*(L"condition\*(R". +Its truth or falsehood determines how the modifier will behave. +.PP +\&\f(CW\*(C`if\*(C'\fR executes the statement once \fIif\fR and only if the condition is +true. \f(CW\*(C`unless\*(C'\fR is the opposite, it executes the statement \fIunless\fR +the condition is true (that is, if the condition is false). See +\&\*(L"Scalar values\*(R" in perldata for definitions of true and false. +.PP +.Vb 2 +\& print "Basset hounds got long ears" if length $ear >= 10; +\& go_outside() and play() unless $is_raining; +.Ve +.PP +The \f(CW\*(C`for(each)\*(C'\fR modifier is an iterator: it executes the statement once +for each item in the \s-1LIST\s0 (with \f(CW$_\fR aliased to each item in turn). +There is no syntax to specify a C\-style for loop or a lexically scoped +iteration variable in this form. +.PP +.Vb 1 +\& print "Hello $_!\en" for qw(world Dolly nurse); +.Ve +.PP +\&\f(CW\*(C`while\*(C'\fR repeats the statement \fIwhile\fR the condition is true. +Postfix \f(CW\*(C`while\*(C'\fR has the same magic treatment of some kinds of condition +that prefix \f(CW\*(C`while\*(C'\fR has. +\&\f(CW\*(C`until\*(C'\fR does the opposite, it repeats the statement \fIuntil\fR the +condition is true (or while the condition is false): +.PP +.Vb 3 +\& # Both of these count from 0 to 10. +\& print $i++ while $i <= 10; +\& print $j++ until $j > 10; +.Ve +.PP +The \f(CW\*(C`while\*(C'\fR and \f(CW\*(C`until\*(C'\fR modifiers have the usual "\f(CW\*(C`while\*(C'\fR loop" +semantics (conditional evaluated first), except when applied to a +\&\f(CW\*(C`do\*(C'\fR\-BLOCK (or to the Perl4 \f(CW\*(C`do\*(C'\fR\-SUBROUTINE statement), in +which case the block executes once before the conditional is +evaluated. +.PP +This is so that you can write loops like: +.PP +.Vb 4 +\& do { +\& $line = <STDIN>; +\& ... +\& } until !defined($line) || $line eq ".\en" +.Ve +.PP +See \*(L"do\*(R" in perlfunc. Note also that the loop control statements described +later will \fI\s-1NOT\s0\fR work in this construct, because modifiers don't take +loop labels. Sorry. You can always put another block inside of it +(for \f(CW\*(C`next\*(C'\fR/\f(CW\*(C`redo\*(C'\fR) or around it (for \f(CW\*(C`last\*(C'\fR) to do that sort of thing. +.IX Xref "next last redo" +.PP +For \f(CW\*(C`next\*(C'\fR or \f(CW\*(C`redo\*(C'\fR, just double the braces: +.PP +.Vb 4 +\& do {{ +\& next if $x == $y; +\& # do something here +\& }} until $x++ > $z; +.Ve +.PP +For \f(CW\*(C`last\*(C'\fR, you have to be more elaborate and put braces around it: +.IX Xref "last" +.PP +.Vb 6 +\& { +\& do { +\& last if $x == $y**2; +\& # do something here +\& } while $x++ <= $z; +\& } +.Ve +.PP +If you need both \f(CW\*(C`next\*(C'\fR and \f(CW\*(C`last\*(C'\fR, you have to do both and also use a +loop label: +.PP +.Vb 7 +\& LOOP: { +\& do {{ +\& next if $x == $y; +\& last LOOP if $x == $y**2; +\& # do something here +\& }} until $x++ > $z; +\& } +.Ve +.PP +\&\fB\s-1NOTE:\s0\fR The behaviour of a \f(CW\*(C`my\*(C'\fR, \f(CW\*(C`state\*(C'\fR, or +\&\f(CW\*(C`our\*(C'\fR modified with a statement modifier conditional +or loop construct (for example, \f(CW\*(C`my $x if ...\*(C'\fR) is +\&\fBundefined\fR. The value of the \f(CW\*(C`my\*(C'\fR variable may be \f(CW\*(C`undef\*(C'\fR, any +previously assigned value, or possibly anything else. Don't rely on +it. Future versions of perl might do something different from the +version of perl you try it out on. Here be dragons. +.IX Xref "my" +.PP +The \f(CW\*(C`when\*(C'\fR modifier is an experimental feature that first appeared in Perl +5.14. To use it, you should include a \f(CW\*(C`use v5.14\*(C'\fR declaration. +(Technically, it requires only the \f(CW\*(C`switch\*(C'\fR feature, but that aspect of it +was not available before 5.14.) Operative only from within a \f(CW\*(C`foreach\*(C'\fR +loop or a \f(CW\*(C`given\*(C'\fR block, it executes the statement only if the smartmatch +\&\f(CW\*(C`$_ ~~ \f(CIEXPR\f(CW\*(C'\fR is true. If the statement executes, it is followed by +a \f(CW\*(C`next\*(C'\fR from inside a \f(CW\*(C`foreach\*(C'\fR and \f(CW\*(C`break\*(C'\fR from inside a \f(CW\*(C`given\*(C'\fR. +.PP +Under the current implementation, the \f(CW\*(C`foreach\*(C'\fR loop can be +anywhere within the \f(CW\*(C`when\*(C'\fR modifier's dynamic scope, but must be +within the \f(CW\*(C`given\*(C'\fR block's lexical scope. This restriction may +be relaxed in a future release. See \*(L"Switch Statements\*(R" below. +.SS "Compound Statements" +.IX Xref "statement, compound block bracket, curly curly bracket brace { } if unless given while until foreach for continue" +.IX Subsection "Compound Statements" +In Perl, a sequence of statements that defines a scope is called a block. +Sometimes a block is delimited by the file containing it (in the case +of a required file, or the program as a whole), and sometimes a block +is delimited by the extent of a string (in the case of an eval). +.PP +But generally, a block is delimited by curly brackets, also known as +braces. We will call this syntactic construct a \s-1BLOCK.\s0 Because enclosing +braces are also the syntax for hash reference constructor expressions +(see perlref), you may occasionally need to disambiguate by placing a +\&\f(CW\*(C`;\*(C'\fR immediately after an opening brace so that Perl realises the brace +is the start of a block. You will more frequently need to disambiguate +the other way, by placing a \f(CW\*(C`+\*(C'\fR immediately before an opening brace to +force it to be interpreted as a hash reference constructor expression. +It is considered good style to use these disambiguating mechanisms +liberally, not only when Perl would otherwise guess incorrectly. +.PP +The following compound statements may be used to control flow: +.PP +.Vb 4 +\& if (EXPR) BLOCK +\& if (EXPR) BLOCK else BLOCK +\& if (EXPR) BLOCK elsif (EXPR) BLOCK ... +\& if (EXPR) BLOCK elsif (EXPR) BLOCK ... else BLOCK +\& +\& unless (EXPR) BLOCK +\& unless (EXPR) BLOCK else BLOCK +\& unless (EXPR) BLOCK elsif (EXPR) BLOCK ... +\& unless (EXPR) BLOCK elsif (EXPR) BLOCK ... else BLOCK +\& +\& given (EXPR) BLOCK +\& +\& LABEL while (EXPR) BLOCK +\& LABEL while (EXPR) BLOCK continue BLOCK +\& +\& LABEL until (EXPR) BLOCK +\& LABEL until (EXPR) BLOCK continue BLOCK +\& +\& LABEL for (EXPR; EXPR; EXPR) BLOCK +\& LABEL for VAR (LIST) BLOCK +\& LABEL for VAR (LIST) BLOCK continue BLOCK +\& +\& LABEL foreach (EXPR; EXPR; EXPR) BLOCK +\& LABEL foreach VAR (LIST) BLOCK +\& LABEL foreach VAR (LIST) BLOCK continue BLOCK +\& +\& LABEL BLOCK +\& LABEL BLOCK continue BLOCK +\& +\& PHASE BLOCK +.Ve +.PP +As of Perl 5.36, you can iterate over multiple values at a time by specifying +a list of lexicals within parentheses: +.PP +.Vb 5 +\& no warnings "experimental::for_list"; +\& LABEL for my (VAR, VAR) (LIST) BLOCK +\& LABEL for my (VAR, VAR) (LIST) BLOCK continue BLOCK +\& LABEL foreach my (VAR, VAR) (LIST) BLOCK +\& LABEL foreach my (VAR, VAR) (LIST) BLOCK continue BLOCK +.Ve +.PP +If enabled by the experimental \f(CW\*(C`try\*(C'\fR feature, the following may also be used +.PP +.Vb 2 +\& try BLOCK catch (VAR) BLOCK +\& try BLOCK catch (VAR) BLOCK finally BLOCK +.Ve +.PP +The experimental \f(CW\*(C`given\*(C'\fR statement is \fInot automatically enabled\fR; see +\&\*(L"Switch Statements\*(R" below for how to do so, and the attendant caveats. +.PP +Unlike in C and Pascal, in Perl these are all defined in terms of BLOCKs, +not statements. This means that the curly brackets are \fIrequired\fR\-\-no +dangling statements allowed. If you want to write conditionals without +curly brackets, there are several other ways to do it. The following +all do the same thing: +.PP +.Vb 5 +\& if (!open(FOO)) { die "Can\*(Aqt open $FOO: $!" } +\& die "Can\*(Aqt open $FOO: $!" unless open(FOO); +\& open(FOO) || die "Can\*(Aqt open $FOO: $!"; +\& open(FOO) ? () : die "Can\*(Aqt open $FOO: $!"; +\& # a bit exotic, that last one +.Ve +.PP +The \f(CW\*(C`if\*(C'\fR statement is straightforward. Because BLOCKs are always +bounded by curly brackets, there is never any ambiguity about which +\&\f(CW\*(C`if\*(C'\fR an \f(CW\*(C`else\*(C'\fR goes with. If you use \f(CW\*(C`unless\*(C'\fR in place of \f(CW\*(C`if\*(C'\fR, +the sense of the test is reversed. Like \f(CW\*(C`if\*(C'\fR, \f(CW\*(C`unless\*(C'\fR can be followed +by \f(CW\*(C`else\*(C'\fR. \f(CW\*(C`unless\*(C'\fR can even be followed by one or more \f(CW\*(C`elsif\*(C'\fR +statements, though you may want to think twice before using that particular +language construct, as everyone reading your code will have to think at least +twice before they can understand what's going on. +.PP +The \f(CW\*(C`while\*(C'\fR statement executes the block as long as the expression is +true. +The \f(CW\*(C`until\*(C'\fR statement executes the block as long as the expression is +false. +The \s-1LABEL\s0 is optional, and if present, consists of an identifier followed +by a colon. The \s-1LABEL\s0 identifies the loop for the loop control +statements \f(CW\*(C`next\*(C'\fR, \f(CW\*(C`last\*(C'\fR, and \f(CW\*(C`redo\*(C'\fR. +If the \s-1LABEL\s0 is omitted, the loop control statement +refers to the innermost enclosing loop. This may include dynamically +searching through your call-stack at run time to find the \s-1LABEL.\s0 Such +desperate behavior triggers a warning if you use the \f(CW\*(C`use warnings\*(C'\fR +pragma or the \fB\-w\fR flag. +.PP +If the condition expression of a \f(CW\*(C`while\*(C'\fR statement is based +on any of a group of iterative expression types then it gets +some magic treatment. The affected iterative expression types +are \f(CW\*(C`readline\*(C'\fR, the \f(CW\*(C`<FILEHANDLE>\*(C'\fR input operator, \f(CW\*(C`readdir\*(C'\fR, \f(CW\*(C`glob\*(C'\fR, the \f(CW\*(C`<PATTERN>\*(C'\fR globbing operator, and \f(CW\*(C`each\*(C'\fR. If the condition expression is one of these expression types, then +the value yielded by the iterative operator will be implicitly assigned +to \f(CW$_\fR. If the condition expression is one of these expression types +or an explicit assignment of one of them to a scalar, then the condition +actually tests for definedness of the expression's value, not for its +regular truth value. +.PP +If there is a \f(CW\*(C`continue\*(C'\fR \s-1BLOCK,\s0 it is always executed just before the +conditional is about to be evaluated again. Thus it can be used to +increment a loop variable, even when the loop has been continued via +the \f(CW\*(C`next\*(C'\fR statement. +.PP +When a block is preceded by a compilation phase keyword such as \f(CW\*(C`BEGIN\*(C'\fR, +\&\f(CW\*(C`END\*(C'\fR, \f(CW\*(C`INIT\*(C'\fR, \f(CW\*(C`CHECK\*(C'\fR, or \f(CW\*(C`UNITCHECK\*(C'\fR, then the block will run only +during the corresponding phase of execution. See perlmod for more details. +.PP +Extension modules can also hook into the Perl parser to define new +kinds of compound statements. These are introduced by a keyword which +the extension recognizes, and the syntax following the keyword is +defined entirely by the extension. If you are an implementor, see +\&\*(L"PL_keyword_plugin\*(R" in perlapi for the mechanism. If you are using such +a module, see the module's documentation for details of the syntax that +it defines. +.SS "Loop Control" +.IX Xref "loop control loop, control next last redo continue" +.IX Subsection "Loop Control" +The \f(CW\*(C`next\*(C'\fR command starts the next iteration of the loop: +.PP +.Vb 4 +\& LINE: while (<STDIN>) { +\& next LINE if /^#/; # discard comments +\& ... +\& } +.Ve +.PP +The \f(CW\*(C`last\*(C'\fR command immediately exits the loop in question. The +\&\f(CW\*(C`continue\*(C'\fR block, if any, is not executed: +.PP +.Vb 4 +\& LINE: while (<STDIN>) { +\& last LINE if /^$/; # exit when done with header +\& ... +\& } +.Ve +.PP +The \f(CW\*(C`redo\*(C'\fR command restarts the loop block without evaluating the +conditional again. The \f(CW\*(C`continue\*(C'\fR block, if any, is \fInot\fR executed. +This command is normally used by programs that want to lie to themselves +about what was just input. +.PP +For example, when processing a file like \fI/etc/termcap\fR. +If your input lines might end in backslashes to indicate continuation, you +want to skip ahead and get the next record. +.PP +.Vb 8 +\& while (<>) { +\& chomp; +\& if (s/\e\e$//) { +\& $_ .= <>; +\& redo unless eof(); +\& } +\& # now process $_ +\& } +.Ve +.PP +which is Perl shorthand for the more explicitly written version: +.PP +.Vb 8 +\& LINE: while (defined($line = <ARGV>)) { +\& chomp($line); +\& if ($line =~ s/\e\e$//) { +\& $line .= <ARGV>; +\& redo LINE unless eof(); # not eof(ARGV)! +\& } +\& # now process $line +\& } +.Ve +.PP +Note that if there were a \f(CW\*(C`continue\*(C'\fR block on the above code, it would +get executed only on lines discarded by the regex (since redo skips the +continue block). A continue block is often used to reset line counters +or \f(CW\*(C`m?pat?\*(C'\fR one-time matches: +.PP +.Vb 10 +\& # inspired by :1,$g/fred/s//WILMA/ +\& while (<>) { +\& m?(fred)? && s//WILMA $1 WILMA/; +\& m?(barney)? && s//BETTY $1 BETTY/; +\& m?(homer)? && s//MARGE $1 MARGE/; +\& } continue { +\& print "$ARGV $.: $_"; +\& close ARGV if eof; # reset $. +\& reset if eof; # reset ?pat? +\& } +.Ve +.PP +If the word \f(CW\*(C`while\*(C'\fR is replaced by the word \f(CW\*(C`until\*(C'\fR, the sense of the +test is reversed, but the conditional is still tested before the first +iteration. +.PP +Loop control statements don't work in an \f(CW\*(C`if\*(C'\fR or \f(CW\*(C`unless\*(C'\fR, since +they aren't loops. You can double the braces to make them such, though. +.PP +.Vb 6 +\& if (/pattern/) {{ +\& last if /fred/; +\& next if /barney/; # same effect as "last", +\& # but doesn\*(Aqt document as well +\& # do something here +\& }} +.Ve +.PP +This is caused by the fact that a block by itself acts as a loop that +executes once, see \*(L"Basic BLOCKs\*(R". +.PP +The form \f(CW\*(C`while/if BLOCK BLOCK\*(C'\fR, available in Perl 4, is no longer +available. Replace any occurrence of \f(CW\*(C`if BLOCK\*(C'\fR by \f(CW\*(C`if (do BLOCK)\*(C'\fR. +.SS "For Loops" +.IX Xref "for foreach" +.IX Subsection "For Loops" +Perl's C\-style \f(CW\*(C`for\*(C'\fR loop works like the corresponding \f(CW\*(C`while\*(C'\fR loop; +that means that this: +.PP +.Vb 3 +\& for ($i = 1; $i < 10; $i++) { +\& ... +\& } +.Ve +.PP +is the same as this: +.PP +.Vb 6 +\& $i = 1; +\& while ($i < 10) { +\& ... +\& } continue { +\& $i++; +\& } +.Ve +.PP +There is one minor difference: if variables are declared with \f(CW\*(C`my\*(C'\fR +in the initialization section of the \f(CW\*(C`for\*(C'\fR, the lexical scope of +those variables is exactly the \f(CW\*(C`for\*(C'\fR loop (the body of the loop +and the control sections). To illustrate: +.IX Xref "my" +.PP +.Vb 5 +\& my $i = \*(Aqsamba\*(Aq; +\& for (my $i = 1; $i <= 4; $i++) { +\& print "$i\en"; +\& } +\& print "$i\en"; +.Ve +.PP +when executed, gives: +.PP +.Vb 5 +\& 1 +\& 2 +\& 3 +\& 4 +\& samba +.Ve +.PP +As a special case, if the test in the \f(CW\*(C`for\*(C'\fR loop (or the corresponding +\&\f(CW\*(C`while\*(C'\fR loop) is empty, it is treated as true. That is, both +.PP +.Vb 3 +\& for (;;) { +\& ... +\& } +.Ve +.PP +and +.PP +.Vb 3 +\& while () { +\& ... +\& } +.Ve +.PP +are treated as infinite loops. +.PP +Besides the normal array index looping, \f(CW\*(C`for\*(C'\fR can lend itself +to many other interesting applications. Here's one that avoids the +problem you get into if you explicitly test for end-of-file on +an interactive file descriptor causing your program to appear to +hang. +.IX Xref "eof end-of-file end of file" +.PP +.Vb 5 +\& $on_a_tty = \-t STDIN && \-t STDOUT; +\& sub prompt { print "yes? " if $on_a_tty } +\& for ( prompt(); <STDIN>; prompt() ) { +\& # do something +\& } +.Ve +.PP +The condition expression of a \f(CW\*(C`for\*(C'\fR loop gets the same magic treatment of +\&\f(CW\*(C`readline\*(C'\fR et al that the condition expression of a \f(CW\*(C`while\*(C'\fR loop gets. +.SS "Foreach Loops" +.IX Xref "for foreach" +.IX Subsection "Foreach Loops" +The \f(CW\*(C`foreach\*(C'\fR loop iterates over a normal list value and sets the scalar +variable \s-1VAR\s0 to be each element of the list in turn. If the variable +is preceded with the keyword \f(CW\*(C`my\*(C'\fR, then it is lexically scoped, and +is therefore visible only within the loop. Otherwise, the variable is +implicitly local to the loop and regains its former value upon exiting +the loop. If the variable was previously declared with \f(CW\*(C`my\*(C'\fR, it uses +that variable instead of the global one, but it's still localized to +the loop. This implicit localization occurs \fIonly\fR for non C\-style +loops. +.IX Xref "my local" +.PP +The \f(CW\*(C`foreach\*(C'\fR keyword is actually a synonym for the \f(CW\*(C`for\*(C'\fR keyword, so +you can use either. If \s-1VAR\s0 is omitted, \f(CW$_\fR is set to each value. +.IX Xref "$_" +.PP +If any element of \s-1LIST\s0 is an lvalue, you can modify it by modifying +\&\s-1VAR\s0 inside the loop. Conversely, if any element of \s-1LIST\s0 is \s-1NOT\s0 an +lvalue, any attempt to modify that element will fail. In other words, +the \f(CW\*(C`foreach\*(C'\fR loop index variable is an implicit alias for each item +in the list that you're looping over. +.IX Xref "alias" +.PP +If any part of \s-1LIST\s0 is an array, \f(CW\*(C`foreach\*(C'\fR will get very confused if +you add or remove elements within the loop body, for example with +\&\f(CW\*(C`splice\*(C'\fR. So don't do that. +.IX Xref "splice" +.PP +\&\f(CW\*(C`foreach\*(C'\fR probably won't do what you expect if \s-1VAR\s0 is a tied or other +special variable. Don't do that either. +.PP +As of Perl 5.22, there is an experimental variant of this loop that accepts +a variable preceded by a backslash for \s-1VAR,\s0 in which case the items in the +\&\s-1LIST\s0 must be references. The backslashed variable will become an alias +to each referenced item in the \s-1LIST,\s0 which must be of the correct type. +The variable needn't be a scalar in this case, and the backslash may be +followed by \f(CW\*(C`my\*(C'\fR. To use this form, you must enable the \f(CW\*(C`refaliasing\*(C'\fR +feature via \f(CW\*(C`use feature\*(C'\fR. (See feature. See also \*(L"Assigning +to References\*(R" in perlref.) +.PP +As of Perl 5.36, you can iterate over multiple values at a time. +You can only iterate with lexical scalars as the iterator variables \- unlike +list assignment, it's not possible to use \f(CW\*(C`undef\*(C'\fR to signify a value that +isn't wanted. This is a limitation of the current implementation, and might +be changed in the future. +.PP +If the size of the \s-1LIST\s0 is not an exact multiple of the number of iterator +variables, then on the last iteration the \*(L"excess\*(R" iterator variables are +aliases to \f(CW\*(C`undef\*(C'\fR, as if the \s-1LIST\s0 had \f(CW\*(C`, undef\*(C'\fR appended as many times as +needed for its length to become an exact multiple. This happens whether +\&\s-1LIST\s0 is a literal \s-1LIST\s0 or an array \- ie arrays are not extended if their +size is not a multiple of the iteration size, consistent with iterating an +array one-at-a-time. As these padding elements are not lvalues, attempting +to modify them will fail, consistent with the behaviour when iterating a +list with literal \f(CW\*(C`undef\*(C'\fRs. If this is not the behaviour you desire, then +before the loop starts either explicitly extend your array to be an exact +multiple, or explicitly throw an exception. +.PP +Examples: +.PP +.Vb 1 +\& for (@ary) { s/foo/bar/ } +\& +\& for my $elem (@elements) { +\& $elem *= 2; +\& } +\& +\& for $count (reverse(1..10), "BOOM") { +\& print $count, "\en"; +\& sleep(1); +\& } +\& +\& for (1..15) { print "Merry Christmas\en"; } +\& +\& foreach $item (split(/:[\e\e\en:]*/, $ENV{TERMCAP})) { +\& print "Item: $item\en"; +\& } +\& +\& use feature "refaliasing"; +\& no warnings "experimental::refaliasing"; +\& foreach \emy %hash (@array_of_hash_references) { +\& # do something with each %hash +\& } +\& +\& foreach my ($foo, $bar, $baz) (@list) { +\& # do something three\-at\-a\-time +\& } +\& +\& foreach my ($key, $value) (%hash) { +\& # iterate over the hash +\& # The hash is immediately copied to a flat list before the loop +\& # starts. The list contains copies of keys but aliases of values. +\& # This is the same behaviour as for $var (%hash) {...} +\& } +.Ve +.PP +Here's how a C programmer might code up a particular algorithm in Perl: +.PP +.Vb 9 +\& for (my $i = 0; $i < @ary1; $i++) { +\& for (my $j = 0; $j < @ary2; $j++) { +\& if ($ary1[$i] > $ary2[$j]) { +\& last; # can\*(Aqt go to outer :\-( +\& } +\& $ary1[$i] += $ary2[$j]; +\& } +\& # this is where that last takes me +\& } +.Ve +.PP +Whereas here's how a Perl programmer more comfortable with the idiom might +do it: +.PP +.Vb 6 +\& OUTER: for my $wid (@ary1) { +\& INNER: for my $jet (@ary2) { +\& next OUTER if $wid > $jet; +\& $wid += $jet; +\& } +\& } +.Ve +.PP +See how much easier this is? It's cleaner, safer, and faster. It's +cleaner because it's less noisy. It's safer because if code gets added +between the inner and outer loops later on, the new code won't be +accidentally executed. The \f(CW\*(C`next\*(C'\fR explicitly iterates the other loop +rather than merely terminating the inner one. And it's faster because +Perl executes a \f(CW\*(C`foreach\*(C'\fR statement more rapidly than it would the +equivalent C\-style \f(CW\*(C`for\*(C'\fR loop. +.PP +Perceptive Perl hackers may have noticed that a \f(CW\*(C`for\*(C'\fR loop has a return +value, and that this value can be captured by wrapping the loop in a \f(CW\*(C`do\*(C'\fR +block. The reward for this discovery is this cautionary advice: The +return value of a \f(CW\*(C`for\*(C'\fR loop is unspecified and may change without notice. +Do not rely on it. +.SS "Try Catch Exception Handling" +.IX Xref "try catch finally" +.IX Subsection "Try Catch Exception Handling" +The \f(CW\*(C`try\*(C'\fR/\f(CW\*(C`catch\*(C'\fR syntax provides control flow relating to exception +handling. The \f(CW\*(C`try\*(C'\fR keyword introduces a block which will be executed when it +is encountered, and the \f(CW\*(C`catch\*(C'\fR block provides code to handle any exception +that may be thrown by the first. +.PP +.Vb 9 +\& try { +\& my $x = call_a_function(); +\& $x < 100 or die "Too big"; +\& send_output($x); +\& } +\& catch ($e) { +\& warn "Unable to output a value; $e"; +\& } +\& print "Finished\en"; +.Ve +.PP +Here, the body of the \f(CW\*(C`catch\*(C'\fR block (i.e. the \f(CW\*(C`warn\*(C'\fR statement) will be +executed if the initial block invokes the conditional \f(CW\*(C`die\*(C'\fR, or if either of +the functions it invokes throws an uncaught exception. The \f(CW\*(C`catch\*(C'\fR block can +inspect the \f(CW$e\fR lexical variable in this case to see what the exception was. +If no exception was thrown then the \f(CW\*(C`catch\*(C'\fR block does not happen. In either +case, execution will then continue from the following statement \- in this +example the \f(CW\*(C`print\*(C'\fR. +.PP +The \f(CW\*(C`catch\*(C'\fR keyword must be immediately followed by a variable declaration in +parentheses, which introduces a new variable visible to the body of the +subsequent block. Inside the block this variable will contain the exception +value that was thrown by the code in the \f(CW\*(C`try\*(C'\fR block. It is not necessary +to use the \f(CW\*(C`my\*(C'\fR keyword to declare this variable; this is implied (similar +as it is for subroutine signatures). +.PP +Both the \f(CW\*(C`try\*(C'\fR and the \f(CW\*(C`catch\*(C'\fR blocks are permitted to contain control-flow +expressions, such as \f(CW\*(C`return\*(C'\fR, \f(CW\*(C`goto\*(C'\fR, or \f(CW\*(C`next\*(C'\fR/\f(CW\*(C`last\*(C'\fR/\f(CW\*(C`redo\*(C'\fR. In all +cases they behave as expected without warnings. In particular, a \f(CW\*(C`return\*(C'\fR +expression inside the \f(CW\*(C`try\*(C'\fR block will make its entire containing function +return \- this is in contrast to its behaviour inside an \f(CW\*(C`eval\*(C'\fR block, where +it would only make that block return. +.PP +Like other control-flow syntax, \f(CW\*(C`try\*(C'\fR and \f(CW\*(C`catch\*(C'\fR will yield the last +evaluated value when placed as the final statement in a function or a \f(CW\*(C`do\*(C'\fR +block. This permits the syntax to be used to create a value. In this case +remember not to use the \f(CW\*(C`return\*(C'\fR expression, or that will cause the +containing function to return. +.PP +.Vb 9 +\& my $value = do { +\& try { +\& get_thing(@args); +\& } +\& catch ($e) { +\& warn "Unable to get thing \- $e"; +\& $DEFAULT_THING; +\& } +\& }; +.Ve +.PP +As with other control-flow syntax, \f(CW\*(C`try\*(C'\fR blocks are not visible to +\&\f(CW\*(C`caller()\*(C'\fR (just as for example, \f(CW\*(C`while\*(C'\fR or \f(CW\*(C`foreach\*(C'\fR loops are not). +Successive levels of the \f(CW\*(C`caller\*(C'\fR result can see subroutine calls and +\&\f(CW\*(C`eval\*(C'\fR blocks, because those affect the way that \f(CW\*(C`return\*(C'\fR would work. Since +\&\f(CW\*(C`try\*(C'\fR blocks do not intercept \f(CW\*(C`return\*(C'\fR, they are not of interest to +\&\f(CW\*(C`caller\*(C'\fR. +.PP +The \f(CW\*(C`try\*(C'\fR and \f(CW\*(C`catch\*(C'\fR blocks may optionally be followed by a third block +introduced by the \f(CW\*(C`finally\*(C'\fR keyword. This third block is executed after the +rest of the construct has finished. +.PP +.Vb 9 +\& try { +\& call_a_function(); +\& } +\& catch ($e) { +\& warn "Unable to call; $e"; +\& } +\& finally { +\& print "Finished\en"; +\& } +.Ve +.PP +The \f(CW\*(C`finally\*(C'\fR block is equivalent to using a \f(CW\*(C`defer\*(C'\fR block and will be +invoked in the same situations; whether the \f(CW\*(C`try\*(C'\fR block completes +successfully, throws an exception, or transfers control elsewhere by using +\&\f(CW\*(C`return\*(C'\fR, a loop control, or \f(CW\*(C`goto\*(C'\fR. +.PP +Unlike the \f(CW\*(C`try\*(C'\fR and \f(CW\*(C`catch\*(C'\fR blocks, a \f(CW\*(C`finally\*(C'\fR block is not permitted to +\&\f(CW\*(C`return\*(C'\fR, \f(CW\*(C`goto\*(C'\fR or use any loop controls. The final expression value is +ignored, and does not affect the return value of the containing function even +if it is placed last in the function. +.PP +This syntax is currently experimental and must be enabled with +\&\f(CW\*(C`use feature \*(Aqtry\*(Aq\*(C'\fR. It emits a warning in the \f(CW\*(C`experimental::try\*(C'\fR category. +.SS "Basic BLOCKs" +.IX Xref "block" +.IX Subsection "Basic BLOCKs" +A \s-1BLOCK\s0 by itself (labeled or not) is semantically equivalent to a +loop that executes once. Thus you can use any of the loop control +statements in it to leave or restart the block. (Note that this is +\&\fI\s-1NOT\s0\fR true in \f(CW\*(C`eval{}\*(C'\fR, \f(CW\*(C`sub{}\*(C'\fR, or contrary to popular belief +\&\f(CW\*(C`do{}\*(C'\fR blocks, which do \fI\s-1NOT\s0\fR count as loops.) The \f(CW\*(C`continue\*(C'\fR +block is optional. +.PP +The \s-1BLOCK\s0 construct can be used to emulate case structures. +.PP +.Vb 6 +\& SWITCH: { +\& if (/^abc/) { $abc = 1; last SWITCH; } +\& if (/^def/) { $def = 1; last SWITCH; } +\& if (/^xyz/) { $xyz = 1; last SWITCH; } +\& $nothing = 1; +\& } +.Ve +.PP +You'll also find that \f(CW\*(C`foreach\*(C'\fR loop used to create a topicalizer +and a switch: +.PP +.Vb 7 +\& SWITCH: +\& for ($var) { +\& if (/^abc/) { $abc = 1; last SWITCH; } +\& if (/^def/) { $def = 1; last SWITCH; } +\& if (/^xyz/) { $xyz = 1; last SWITCH; } +\& $nothing = 1; +\& } +.Ve +.PP +Such constructs are quite frequently used, both because older versions of +Perl had no official \f(CW\*(C`switch\*(C'\fR statement, and also because the new version +described immediately below remains experimental and can sometimes be confusing. +.SS "defer blocks" +.IX Xref "defer" +.IX Subsection "defer blocks" +A block prefixed by the \f(CW\*(C`defer\*(C'\fR modifier provides a section of code which +runs at a later time during scope exit. +.PP +A \f(CW\*(C`defer\*(C'\fR block can appear at any point where a regular block or other +statement is permitted. If the flow of execution reaches this statement, the +body of the block is stored for later, but not invoked immediately. When the +flow of control leaves the containing block for any reason, this stored block +is executed on the way past. It provides a means of deferring execution until +a later time. This acts similarly to syntax provided by some other languages, +often using keywords named \f(CW\*(C`try / finally\*(C'\fR. +.PP +This syntax is available if enabled by the \f(CW\*(C`defer\*(C'\fR named feature, and is +currently experimental. If experimental warnings are enabled it will emit a +warning when used. +.PP +.Vb 1 +\& use feature \*(Aqdefer\*(Aq; +\& +\& { +\& say "This happens first"; +\& defer { say "This happens last"; } +\& +\& say "And this happens inbetween"; +\& } +.Ve +.PP +If multiple \f(CW\*(C`defer\*(C'\fR blocks are contained in a single scope, they are +executed in \s-1LIFO\s0 order; the last one reached is the first one executed. +.PP +The code stored by the \f(CW\*(C`defer\*(C'\fR block will be invoked when control leaves +its containing block due to regular fallthrough, explicit \f(CW\*(C`return\*(C'\fR, +exceptions thrown by \f(CW\*(C`die\*(C'\fR or propagated by functions called by it, \f(CW\*(C`goto\*(C'\fR, +or any of the loop control statements \f(CW\*(C`next\*(C'\fR, \f(CW\*(C`last\*(C'\fR or \f(CW\*(C`redo\*(C'\fR. +.PP +If the flow of control does not reach the \f(CW\*(C`defer\*(C'\fR statement itself then its +body is not stored for later execution. (This is in direct contrast to the +code provided by an \f(CW\*(C`END\*(C'\fR phaser block, which is always enqueued by the +compiler, regardless of whether execution ever reached the line it was given +on.) +.PP +.Vb 1 +\& use feature \*(Aqdefer\*(Aq; +\& +\& { +\& defer { say "This will run"; } +\& return; +\& defer { say "This will not"; } +\& } +.Ve +.PP +Exceptions thrown by code inside a \f(CW\*(C`defer\*(C'\fR block will propagate to the +caller in the same way as any other exception thrown by normal code. +.PP +If the \f(CW\*(C`defer\*(C'\fR block is being executed due to a thrown exception and throws +another one it is not specified what happens, beyond that the caller will +definitely receive an exception. +.PP +Besides throwing an exception, a \f(CW\*(C`defer\*(C'\fR block is not permitted to +otherwise alter the control flow of its surrounding code. In particular, it +may not cause its containing function to \f(CW\*(C`return\*(C'\fR, nor may it \f(CW\*(C`goto\*(C'\fR a +label, or control a containing loop using \f(CW\*(C`next\*(C'\fR, \f(CW\*(C`last\*(C'\fR or \f(CW\*(C`redo\*(C'\fR. These +constructions are however, permitted entirely within the body of the +\&\f(CW\*(C`defer\*(C'\fR. +.PP +.Vb 1 +\& use feature \*(Aqdefer\*(Aq; +\& +\& { +\& defer { +\& foreach ( 1 .. 5 ) { +\& last if $_ == 3; # this is permitted +\& } +\& } +\& } +\& +\& { +\& foreach ( 6 .. 10 ) { +\& defer { +\& last if $_ == 8; # this is not +\& } +\& } +\& } +.Ve +.SS "Switch Statements" +.IX Subsection "Switch Statements" + +.IX Xref "switch case given when default" +.PP +Starting from Perl 5.10.1 (well, 5.10.0, but it didn't work +right), you can say +.PP +.Vb 1 +\& use feature "switch"; +.Ve +.PP +to enable an experimental switch feature. This is loosely based on an +old version of a Raku proposal, but it no longer resembles the Raku +construct. You also get the switch feature whenever you declare that your +code prefers to run under a version of Perl between 5.10 and 5.34. For +example: +.PP +.Vb 1 +\& use v5.14; +.Ve +.PP +Under the \*(L"switch\*(R" feature, Perl gains the experimental keywords +\&\f(CW\*(C`given\*(C'\fR, \f(CW\*(C`when\*(C'\fR, \f(CW\*(C`default\*(C'\fR, \f(CW\*(C`continue\*(C'\fR, and \f(CW\*(C`break\*(C'\fR. +Starting from Perl 5.16, one can prefix the switch +keywords with \f(CW\*(C`CORE::\*(C'\fR to access the feature without a \f(CW\*(C`use feature\*(C'\fR +statement. The keywords \f(CW\*(C`given\*(C'\fR and +\&\f(CW\*(C`when\*(C'\fR are analogous to \f(CW\*(C`switch\*(C'\fR and +\&\f(CW\*(C`case\*(C'\fR in other languages \*(-- though \f(CW\*(C`continue\*(C'\fR is not \*(-- so the code +in the previous section could be rewritten as +.PP +.Vb 7 +\& use v5.10.1; +\& for ($var) { +\& when (/^abc/) { $abc = 1 } +\& when (/^def/) { $def = 1 } +\& when (/^xyz/) { $xyz = 1 } +\& default { $nothing = 1 } +\& } +.Ve +.PP +The \f(CW\*(C`foreach\*(C'\fR is the non-experimental way to set a topicalizer. +If you wish to use the highly experimental \f(CW\*(C`given\*(C'\fR, that could be +written like this: +.PP +.Vb 7 +\& use v5.10.1; +\& given ($var) { +\& when (/^abc/) { $abc = 1 } +\& when (/^def/) { $def = 1 } +\& when (/^xyz/) { $xyz = 1 } +\& default { $nothing = 1 } +\& } +.Ve +.PP +As of 5.14, that can also be written this way: +.PP +.Vb 7 +\& use v5.14; +\& for ($var) { +\& $abc = 1 when /^abc/; +\& $def = 1 when /^def/; +\& $xyz = 1 when /^xyz/; +\& default { $nothing = 1 } +\& } +.Ve +.PP +Or if you don't care to play it safe, like this: +.PP +.Vb 7 +\& use v5.14; +\& given ($var) { +\& $abc = 1 when /^abc/; +\& $def = 1 when /^def/; +\& $xyz = 1 when /^xyz/; +\& default { $nothing = 1 } +\& } +.Ve +.PP +The arguments to \f(CW\*(C`given\*(C'\fR and \f(CW\*(C`when\*(C'\fR are in scalar context, +and \f(CW\*(C`given\*(C'\fR assigns the \f(CW$_\fR variable its topic value. +.PP +Exactly what the \fI\s-1EXPR\s0\fR argument to \f(CW\*(C`when\*(C'\fR does is hard to describe +precisely, but in general, it tries to guess what you want done. Sometimes +it is interpreted as \f(CW\*(C`$_ ~~ \f(CIEXPR\f(CW\*(C'\fR, and sometimes it is not. It +also behaves differently when lexically enclosed by a \f(CW\*(C`given\*(C'\fR block than +it does when dynamically enclosed by a \f(CW\*(C`foreach\*(C'\fR loop. The rules are far +too difficult to understand to be described here. See \*(L"Experimental Details +on given and when\*(R" later on. +.PP +Due to an unfortunate bug in how \f(CW\*(C`given\*(C'\fR was implemented between Perl 5.10 +and 5.16, under those implementations the version of \f(CW$_\fR governed by +\&\f(CW\*(C`given\*(C'\fR is merely a lexically scoped copy of the original, not a +dynamically scoped alias to the original, as it would be if it were a +\&\f(CW\*(C`foreach\*(C'\fR or under both the original and the current Raku language +specification. This bug was fixed in Perl 5.18 (and lexicalized \f(CW$_\fR itself +was removed in Perl 5.24). +.PP +If your code still needs to run on older versions, +stick to \f(CW\*(C`foreach\*(C'\fR for your topicalizer and +you will be less unhappy. +.SS "Goto" +.IX Xref "goto" +.IX Subsection "Goto" +Although not for the faint of heart, Perl does support a \f(CW\*(C`goto\*(C'\fR +statement. There are three forms: \f(CW\*(C`goto\*(C'\fR\-LABEL, \f(CW\*(C`goto\*(C'\fR\-EXPR, and +\&\f(CW\*(C`goto\*(C'\fR\-&NAME. A loop's \s-1LABEL\s0 is not actually a valid target for +a \f(CW\*(C`goto\*(C'\fR; it's just the name of the loop. +.PP +The \f(CW\*(C`goto\*(C'\fR\-LABEL form finds the statement labeled with \s-1LABEL\s0 and resumes +execution there. It may not be used to go into any construct that +requires initialization, such as a subroutine or a \f(CW\*(C`foreach\*(C'\fR loop. It +also can't be used to go into a construct that is optimized away. It +can be used to go almost anywhere else within the dynamic scope, +including out of subroutines, but it's usually better to use some other +construct such as \f(CW\*(C`last\*(C'\fR or \f(CW\*(C`die\*(C'\fR. The author of Perl has never felt the +need to use this form of \f(CW\*(C`goto\*(C'\fR (in Perl, that is\*(--C is another matter). +.PP +The \f(CW\*(C`goto\*(C'\fR\-EXPR form expects a label name, whose scope will be resolved +dynamically. This allows for computed \f(CW\*(C`goto\*(C'\fRs per \s-1FORTRAN,\s0 but isn't +necessarily recommended if you're optimizing for maintainability: +.PP +.Vb 1 +\& goto(("FOO", "BAR", "GLARCH")[$i]); +.Ve +.PP +The \f(CW\*(C`goto\*(C'\fR\-&NAME form is highly magical, and substitutes a call to the +named subroutine for the currently running subroutine. This is used by +\&\f(CW\*(C`AUTOLOAD()\*(C'\fR subroutines that wish to load another subroutine and then +pretend that the other subroutine had been called in the first place +(except that any modifications to \f(CW@_\fR in the current subroutine are +propagated to the other subroutine.) After the \f(CW\*(C`goto\*(C'\fR, not even \f(CW\*(C`caller()\*(C'\fR +will be able to tell that this routine was called first. +.PP +In almost all cases like this, it's usually a far, far better idea to use the +structured control flow mechanisms of \f(CW\*(C`next\*(C'\fR, \f(CW\*(C`last\*(C'\fR, or \f(CW\*(C`redo\*(C'\fR instead of +resorting to a \f(CW\*(C`goto\*(C'\fR. For certain applications, the catch and throw pair of +\&\f(CW\*(C`eval{}\*(C'\fR and \fBdie()\fR for exception processing can also be a prudent approach. +.SS "The Ellipsis Statement" +.IX Xref "... ... statement ellipsis operator elliptical statement unimplemented statement unimplemented operator yada-yada yada-yada operator ... operator whatever operator triple-dot operator" +.IX Subsection "The Ellipsis Statement" +Beginning in Perl 5.12, Perl accepts an ellipsis, "\f(CW\*(C`...\*(C'\fR", as a +placeholder for code that you haven't implemented yet. +When Perl 5.12 or later encounters an ellipsis statement, it parses this +without error, but if and when you should actually try to execute it, Perl +throws an exception with the text \f(CW\*(C`Unimplemented\*(C'\fR: +.PP +.Vb 6 +\& use v5.12; +\& sub unimplemented { ... } +\& eval { unimplemented() }; +\& if ($@ =~ /^Unimplemented at /) { +\& say "I found an ellipsis!"; +\& } +.Ve +.PP +You can only use the elliptical statement to stand in for a complete +statement. Syntactically, "\f(CW\*(C`...;\*(C'\fR\*(L" is a complete statement, but, +as with other kinds of semicolon-terminated statement, the semicolon +may be omitted if \*(R"\f(CW\*(C`...\*(C'\fR" appears immediately before a closing brace. +These examples show how the ellipsis works: +.PP +.Vb 10 +\& use v5.12; +\& { ... } +\& sub foo { ... } +\& ...; +\& eval { ... }; +\& sub somemeth { +\& my $self = shift; +\& ...; +\& } +\& $x = do { +\& my $n; +\& ...; +\& say "Hurrah!"; +\& $n; +\& }; +.Ve +.PP +The elliptical statement cannot stand in for an expression that +is part of a larger statement. +These examples of attempts to use an ellipsis are syntax errors: +.PP +.Vb 1 +\& use v5.12; +\& +\& print ...; +\& open(my $fh, ">", "/dev/passwd") or ...; +\& if ($condition && ... ) { say "Howdy" }; +\& ... if $a > $b; +\& say "Cromulent" if ...; +\& $flub = 5 + ...; +.Ve +.PP +There are some cases where Perl can't immediately tell the difference +between an expression and a statement. For instance, the syntax for a +block and an anonymous hash reference constructor look the same unless +there's something in the braces to give Perl a hint. The ellipsis is a +syntax error if Perl doesn't guess that the \f(CW\*(C`{ ... }\*(C'\fR is a block. +Inside your block, you can use a \f(CW\*(C`;\*(C'\fR before the ellipsis to denote that the +\&\f(CW\*(C`{ ... }\*(C'\fR is a block and not a hash reference constructor. +.PP +Note: Some folks colloquially refer to this bit of punctuation as a +\&\*(L"yada-yada\*(R" or \*(L"triple-dot\*(R", but its true name +is actually an ellipsis. +.SS "PODs: Embedded Documentation" +.IX Xref "POD documentation" +.IX Subsection "PODs: Embedded Documentation" +Perl has a mechanism for intermixing documentation with source code. +While it's expecting the beginning of a new statement, if the compiler +encounters a line that begins with an equal sign and a word, like this +.PP +.Vb 1 +\& =head1 Here There Be Pods! +.Ve +.PP +Then that text and all remaining text up through and including a line +beginning with \f(CW\*(C`=cut\*(C'\fR will be ignored. The format of the intervening +text is described in perlpod. +.PP +This allows you to intermix your source code +and your documentation text freely, as in +.PP +.Vb 1 +\& =item snazzle($) +\& +\& The snazzle() function will behave in the most spectacular +\& form that you can possibly imagine, not even excepting +\& cybernetic pyrotechnics. +\& +\& =cut back to the compiler, nuff of this pod stuff! +\& +\& sub snazzle($) { +\& my $thingie = shift; +\& ......... +\& } +.Ve +.PP +Note that pod translators should look at only paragraphs beginning +with a pod directive (it makes parsing easier), whereas the compiler +actually knows to look for pod escapes even in the middle of a +paragraph. This means that the following secret stuff will be +ignored by both the compiler and the translators. +.PP +.Vb 5 +\& $a=3; +\& =secret stuff +\& warn "Neither POD nor CODE!?" +\& =cut back +\& print "got $a\en"; +.Ve +.PP +You probably shouldn't rely upon the \f(CW\*(C`warn()\*(C'\fR being podded out forever. +Not all pod translators are well-behaved in this regard, and perhaps +the compiler will become pickier. +.PP +One may also use pod directives to quickly comment out a section +of code. +.SS "Plain Old Comments (Not!)" +.IX Xref "comment line # preprocessor eval" +.IX Subsection "Plain Old Comments (Not!)" +Perl can process line directives, much like the C preprocessor. Using +this, one can control Perl's idea of filenames and line numbers in +error or warning messages (especially for strings that are processed +with \f(CW\*(C`eval()\*(C'\fR). The syntax for this mechanism is almost the same as for +most C preprocessors: it matches the regular expression +.PP +.Vb 5 +\& # example: \*(Aq# line 42 "new_filename.plx"\*(Aq +\& /^\e# \es* +\& line \es+ (\ed+) \es* +\& (?:\es("?)([^"]+)\eg2)? \es* +\& $/x +.Ve +.PP +with \f(CW$1\fR being the line number for the next line, and \f(CW$3\fR being +the optional filename (specified with or without quotes). Note that +no whitespace may precede the \f(CW\*(C`#\*(C'\fR, unlike modern C preprocessors. +.PP +There is a fairly obvious gotcha included with the line directive: +Debuggers and profilers will only show the last source line to appear +at a particular line number in a given file. Care should be taken not +to cause line number collisions in code you'd like to debug later. +.PP +Here are some examples that you should be able to type into your command +shell: +.PP +.Vb 6 +\& % perl +\& # line 200 "bzzzt" +\& # the \*(Aq#\*(Aq on the previous line must be the first char on line +\& die \*(Aqfoo\*(Aq; +\& _\|_END_\|_ +\& foo at bzzzt line 201. +\& +\& % perl +\& # line 200 "bzzzt" +\& eval qq[\en#line 2001 ""\endie \*(Aqfoo\*(Aq]; print $@; +\& _\|_END_\|_ +\& foo at \- line 2001. +\& +\& % perl +\& eval qq[\en#line 200 "foo bar"\endie \*(Aqfoo\*(Aq]; print $@; +\& _\|_END_\|_ +\& foo at foo bar line 200. +\& +\& % perl +\& # line 345 "goop" +\& eval "\en#line " . _\|_LINE_\|_ . \*(Aq "\*(Aq . _\|_FILE_\|_ ."\e"\endie \*(Aqfoo\*(Aq"; +\& print $@; +\& _\|_END_\|_ +\& foo at goop line 345. +.Ve +.SS "Experimental Details on given and when" +.IX Subsection "Experimental Details on given and when" +As previously mentioned, the \*(L"switch\*(R" feature is considered highly +experimental; it is subject to change with little notice. In particular, +\&\f(CW\*(C`when\*(C'\fR has tricky behaviours that are expected to change to become less +tricky in the future. Do not rely upon its current (mis)implementation. +Before Perl 5.18, \f(CW\*(C`given\*(C'\fR also had tricky behaviours that you should still +beware of if your code must run on older versions of Perl. +.PP +Here is a longer example of \f(CW\*(C`given\*(C'\fR: +.PP +.Vb 10 +\& use feature ":5.10"; +\& given ($foo) { +\& when (undef) { +\& say \*(Aq$foo is undefined\*(Aq; +\& } +\& when ("foo") { +\& say \*(Aq$foo is the string "foo"\*(Aq; +\& } +\& when ([1,3,5,7,9]) { +\& say \*(Aq$foo is an odd digit\*(Aq; +\& continue; # Fall through +\& } +\& when ($_ < 100) { +\& say \*(Aq$foo is numerically less than 100\*(Aq; +\& } +\& when (\e&complicated_check) { +\& say \*(Aqa complicated check for $foo is true\*(Aq; +\& } +\& default { +\& die q(I don\*(Aqt know what to do with $foo); +\& } +\& } +.Ve +.PP +Before Perl 5.18, \f(CW\*(C`given(EXPR)\*(C'\fR assigned the value of \fI\s-1EXPR\s0\fR to +merely a lexically scoped \fI\f(BIcopy\fI\fR (!) of \f(CW$_\fR, not a dynamically +scoped alias the way \f(CW\*(C`foreach\*(C'\fR does. That made it similar to +.PP +.Vb 1 +\& do { my $_ = EXPR; ... } +.Ve +.PP +except that the block was automatically broken out of by a successful +\&\f(CW\*(C`when\*(C'\fR or an explicit \f(CW\*(C`break\*(C'\fR. Because it was only a copy, and because +it was only lexically scoped, not dynamically scoped, you could not do the +things with it that you are used to in a \f(CW\*(C`foreach\*(C'\fR loop. In particular, +it did not work for arbitrary function calls if those functions might try +to access \f(CW$_\fR. Best stick to \f(CW\*(C`foreach\*(C'\fR for that. +.PP +Most of the power comes from the implicit smartmatching that can +sometimes apply. Most of the time, \f(CW\*(C`when(EXPR)\*(C'\fR is treated as an +implicit smartmatch of \f(CW$_\fR, that is, \f(CW\*(C`$_ ~~ EXPR\*(C'\fR. (See +\&\*(L"Smartmatch Operator\*(R" in perlop for more information on smartmatching.) +But when \fI\s-1EXPR\s0\fR is one of the 10 exceptional cases (or things like them) +listed below, it is used directly as a boolean. +.IP "1." 4 +.IX Item "1." +A user-defined subroutine call or a method invocation. +.IP "2." 4 +.IX Item "2." +A regular expression match in the form of \f(CW\*(C`/REGEX/\*(C'\fR, \f(CW\*(C`$foo =~ /REGEX/\*(C'\fR, +or \f(CW\*(C`$foo =~ EXPR\*(C'\fR. Also, a negated regular expression match in +the form \f(CW\*(C`!/REGEX/\*(C'\fR, \f(CW\*(C`$foo !~ /REGEX/\*(C'\fR, or \f(CW\*(C`$foo !~ EXPR\*(C'\fR. +.IP "3." 4 +.IX Item "3." +A smart match that uses an explicit \f(CW\*(C`~~\*(C'\fR operator, such as \f(CW\*(C`EXPR ~~ EXPR\*(C'\fR. +.Sp +\&\fB\s-1NOTE:\s0\fR You will often have to use \f(CW\*(C`$c ~~ $_\*(C'\fR because the default case +uses \f(CW\*(C`$_ ~~ $c\*(C'\fR , which is frequently the opposite of what you want. +.IP "4." 4 +.IX Item "4." +A boolean comparison operator such as \f(CW\*(C`$_ < 10\*(C'\fR or \f(CW\*(C`$x eq "abc"\*(C'\fR. The +relational operators that this applies to are the six numeric comparisons +(\f(CW\*(C`<\*(C'\fR, \f(CW\*(C`>\*(C'\fR, \f(CW\*(C`<=\*(C'\fR, \f(CW\*(C`>=\*(C'\fR, \f(CW\*(C`==\*(C'\fR, and \f(CW\*(C`!=\*(C'\fR), and +the six string comparisons (\f(CW\*(C`lt\*(C'\fR, \f(CW\*(C`gt\*(C'\fR, \f(CW\*(C`le\*(C'\fR, \f(CW\*(C`ge\*(C'\fR, \f(CW\*(C`eq\*(C'\fR, and \f(CW\*(C`ne\*(C'\fR). +.IP "5." 4 +.IX Item "5." +At least the three builtin functions \f(CW\*(C`defined(...)\*(C'\fR, \f(CW\*(C`exists(...)\*(C'\fR, and +\&\f(CW\*(C`eof(...)\*(C'\fR. We might someday add more of these later if we think of them. +.IP "6." 4 +.IX Item "6." +A negated expression, whether \f(CW\*(C`!(EXPR)\*(C'\fR or \f(CW\*(C`not(EXPR)\*(C'\fR, or a logical +exclusive-or, \f(CW\*(C`(EXPR1) xor (EXPR2)\*(C'\fR. The bitwise versions (\f(CW\*(C`~\*(C'\fR and \f(CW\*(C`^\*(C'\fR) +are not included. +.IP "7." 4 +.IX Item "7." +A filetest operator, with exactly 4 exceptions: \f(CW\*(C`\-s\*(C'\fR, \f(CW\*(C`\-M\*(C'\fR, \f(CW\*(C`\-A\*(C'\fR, and +\&\f(CW\*(C`\-C\*(C'\fR, as these return numerical values, not boolean ones. The \f(CW\*(C`\-z\*(C'\fR +filetest operator is not included in the exception list. +.IP "8." 4 +.IX Item "8." +The \f(CW\*(C`..\*(C'\fR and \f(CW\*(C`...\*(C'\fR flip-flop operators. Note that the \f(CW\*(C`...\*(C'\fR flip-flop +operator is completely different from the \f(CW\*(C`...\*(C'\fR elliptical statement +just described. +.PP +In those 8 cases above, the value of \s-1EXPR\s0 is used directly as a boolean, so +no smartmatching is done. You may think of \f(CW\*(C`when\*(C'\fR as a smartsmartmatch. +.PP +Furthermore, Perl inspects the operands of logical operators to +decide whether to use smartmatching for each one by applying the +above test to the operands: +.IP "9." 4 +.IX Item "9." +If \s-1EXPR\s0 is \f(CW\*(C`EXPR1 && EXPR2\*(C'\fR or \f(CW\*(C`EXPR1 and EXPR2\*(C'\fR, the test is applied +\&\fIrecursively\fR to both \s-1EXPR1\s0 and \s-1EXPR2.\s0 +Only if \fIboth\fR operands also pass the +test, \fIrecursively\fR, will the expression be treated as boolean. Otherwise, +smartmatching is used. +.IP "10." 4 +.IX Item "10." +If \s-1EXPR\s0 is \f(CW\*(C`EXPR1 || EXPR2\*(C'\fR, \f(CW\*(C`EXPR1 // EXPR2\*(C'\fR, or \f(CW\*(C`EXPR1 or EXPR2\*(C'\fR, the +test is applied \fIrecursively\fR to \s-1EXPR1\s0 only (which might itself be a +higher-precedence \s-1AND\s0 operator, for example, and thus subject to the +previous rule), not to \s-1EXPR2.\s0 If \s-1EXPR1\s0 is to use smartmatching, then \s-1EXPR2\s0 +also does so, no matter what \s-1EXPR2\s0 contains. But if \s-1EXPR2\s0 does not get to +use smartmatching, then the second argument will not be either. This is +quite different from the \f(CW\*(C`&&\*(C'\fR case just described, so be careful. +.PP +These rules are complicated, but the goal is for them to do what you want +(even if you don't quite understand why they are doing it). For example: +.PP +.Vb 1 +\& when (/^\ed+$/ && $_ < 75) { ... } +.Ve +.PP +will be treated as a boolean match because the rules say both +a regex match and an explicit test on \f(CW$_\fR will be treated +as boolean. +.PP +Also: +.PP +.Vb 1 +\& when ([qw(foo bar)] && /baz/) { ... } +.Ve +.PP +will use smartmatching because only \fIone\fR of the operands is a boolean: +the other uses smartmatching, and that wins. +.PP +Further: +.PP +.Vb 1 +\& when ([qw(foo bar)] || /^baz/) { ... } +.Ve +.PP +will use smart matching (only the first operand is considered), whereas +.PP +.Vb 1 +\& when (/^baz/ || [qw(foo bar)]) { ... } +.Ve +.PP +will test only the regex, which causes both operands to be +treated as boolean. Watch out for this one, then, because an +arrayref is always a true value, which makes it effectively +redundant. Not a good idea. +.PP +Tautologous boolean operators are still going to be optimized +away. Don't be tempted to write +.PP +.Vb 1 +\& when ("foo" or "bar") { ... } +.Ve +.PP +This will optimize down to \f(CW"foo"\fR, so \f(CW"bar"\fR will never be considered (even +though the rules say to use a smartmatch +on \f(CW"foo"\fR). For an alternation like +this, an array ref will work, because this will instigate smartmatching: +.PP +.Vb 1 +\& when ([qw(foo bar)] { ... } +.Ve +.PP +This is somewhat equivalent to the C\-style switch statement's fallthrough +functionality (not to be confused with \fIPerl's\fR fallthrough +functionality\*(--see below), wherein the same block is used for several +\&\f(CW\*(C`case\*(C'\fR statements. +.PP +Another useful shortcut is that, if you use a literal array or hash as the +argument to \f(CW\*(C`given\*(C'\fR, it is turned into a reference. So \f(CW\*(C`given(@foo)\*(C'\fR is +the same as \f(CW\*(C`given(\e@foo)\*(C'\fR, for example. +.PP +\&\f(CW\*(C`default\*(C'\fR behaves exactly like \f(CW\*(C`when(1 == 1)\*(C'\fR, which is +to say that it always matches. +.PP +\fIBreaking out\fR +.IX Subsection "Breaking out" +.PP +You can use the \f(CW\*(C`break\*(C'\fR keyword to break out of the enclosing +\&\f(CW\*(C`given\*(C'\fR block. Every \f(CW\*(C`when\*(C'\fR block is implicitly ended with +a \f(CW\*(C`break\*(C'\fR. +.PP +\fIFall-through\fR +.IX Subsection "Fall-through" +.PP +You can use the \f(CW\*(C`continue\*(C'\fR keyword to fall through from one +case to the next immediate \f(CW\*(C`when\*(C'\fR or \f(CW\*(C`default\*(C'\fR: +.PP +.Vb 5 +\& given($foo) { +\& when (/x/) { say \*(Aq$foo contains an x\*(Aq; continue } +\& when (/y/) { say \*(Aq$foo contains a y\*(Aq } +\& default { say \*(Aq$foo does not contain a y\*(Aq } +\& } +.Ve +.PP +\fIReturn value\fR +.IX Subsection "Return value" +.PP +When a \f(CW\*(C`given\*(C'\fR statement is also a valid expression (for example, +when it's the last statement of a block), it evaluates to: +.IP "\(bu" 4 +An empty list as soon as an explicit \f(CW\*(C`break\*(C'\fR is encountered. +.IP "\(bu" 4 +The value of the last evaluated expression of the successful +\&\f(CW\*(C`when\*(C'\fR/\f(CW\*(C`default\*(C'\fR clause, if there happens to be one. +.IP "\(bu" 4 +The value of the last evaluated expression of the \f(CW\*(C`given\*(C'\fR block if no +condition is true. +.PP +In both last cases, the last expression is evaluated in the context that +was applied to the \f(CW\*(C`given\*(C'\fR block. +.PP +Note that, unlike \f(CW\*(C`if\*(C'\fR and \f(CW\*(C`unless\*(C'\fR, failed \f(CW\*(C`when\*(C'\fR statements always +evaluate to an empty list. +.PP +.Vb 8 +\& my $price = do { +\& given ($item) { +\& when (["pear", "apple"]) { 1 } +\& break when "vote"; # My vote cannot be bought +\& 1e10 when /Mona Lisa/; +\& "unknown"; +\& } +\& }; +.Ve +.PP +Currently, \f(CW\*(C`given\*(C'\fR blocks can't always +be used as proper expressions. This +may be addressed in a future version of Perl. +.PP +\fISwitching in a loop\fR +.IX Subsection "Switching in a loop" +.PP +Instead of using \f(CW\*(C`given()\*(C'\fR, you can use a \f(CW\*(C`foreach()\*(C'\fR loop. +For example, here's one way to count how many times a particular +string occurs in an array: +.PP +.Vb 6 +\& use v5.10.1; +\& my $count = 0; +\& for (@array) { +\& when ("foo") { ++$count } +\& } +\& print "\e@array contains $count copies of \*(Aqfoo\*(Aq\en"; +.Ve +.PP +Or in a more recent version: +.PP +.Vb 6 +\& use v5.14; +\& my $count = 0; +\& for (@array) { +\& ++$count when "foo"; +\& } +\& print "\e@array contains $count copies of \*(Aqfoo\*(Aq\en"; +.Ve +.PP +At the end of all \f(CW\*(C`when\*(C'\fR blocks, there is an implicit \f(CW\*(C`next\*(C'\fR. +You can override that with an explicit \f(CW\*(C`last\*(C'\fR if you're +interested in only the first match alone. +.PP +This doesn't work if you explicitly specify a loop variable, as +in \f(CW\*(C`for $item (@array)\*(C'\fR. You have to use the default variable \f(CW$_\fR. +.PP +\fIDifferences from Raku\fR +.IX Subsection "Differences from Raku" +.PP +The Perl 5 smartmatch and \f(CW\*(C`given\*(C'\fR/\f(CW\*(C`when\*(C'\fR constructs are not compatible +with their Raku analogues. The most visible difference and least +important difference is that, in Perl 5, parentheses are required around +the argument to \f(CW\*(C`given()\*(C'\fR and \f(CW\*(C`when()\*(C'\fR (except when this last one is used +as a statement modifier). Parentheses in Raku are always optional in a +control construct such as \f(CW\*(C`if()\*(C'\fR, \f(CW\*(C`while()\*(C'\fR, or \f(CW\*(C`when()\*(C'\fR; they can't be +made optional in Perl 5 without a great deal of potential confusion, +because Perl 5 would parse the expression +.PP +.Vb 3 +\& given $foo { +\& ... +\& } +.Ve +.PP +as though the argument to \f(CW\*(C`given\*(C'\fR were an element of the hash +\&\f(CW%foo\fR, interpreting the braces as hash-element syntax. +.PP +However, their are many, many other differences. For example, +this works in Perl 5: +.PP +.Vb 2 +\& use v5.12; +\& my @primary = ("red", "blue", "green"); +\& +\& if (@primary ~~ "red") { +\& say "primary smartmatches red"; +\& } +\& +\& if ("red" ~~ @primary) { +\& say "red smartmatches primary"; +\& } +\& +\& say "that\*(Aqs all, folks!"; +.Ve +.PP +But it doesn't work at all in Raku. Instead, you should +use the (parallelizable) \f(CW\*(C`any\*(C'\fR operator: +.PP +.Vb 3 +\& if any(@primary) eq "red" { +\& say "primary smartmatches red"; +\& } +\& +\& if "red" eq any(@primary) { +\& say "red smartmatches primary"; +\& } +.Ve +.PP +The table of smartmatches in \*(L"Smartmatch Operator\*(R" in perlop is not +identical to that proposed by the Raku specification, mainly due to +differences between Raku's and Perl 5's data models, but also because +the Raku spec has changed since Perl 5 rushed into early adoption. +.PP +In Raku, \f(CW\*(C`when()\*(C'\fR will always do an implicit smartmatch with its +argument, while in Perl 5 it is convenient (albeit potentially confusing) to +suppress this implicit smartmatch in various rather loosely-defined +situations, as roughly outlined above. (The difference is largely because +Perl 5 does not have, even internally, a boolean type.) |