Understanding strange Perl multiline comment mechanism

前端 未结 3 546
深忆病人
深忆病人 2021-01-11 11:55

EDIT: Note to new Perl programmers: This mechanism should NOT be used for multiline comments! It has a flaw decreases readability.

In this PerlMonks

相关标签:
3条回答
  • 2021-01-11 12:13

    The following isn't as pretty, but it results in no executable code.

    0 && <<COMMENT
    ...
    COMMENT
    
    0 讨论(0)
  • 2021-01-11 12:15

    Hah. There is no such thing as a "<< >>" operator. What's going on there is basically equivalent to this:

    "" =~ ''
    

    =~ is, of course, the normal pattern-binding operator you normally use with m// or s///. The '' is using the q{} syntax for literal strings, with > as a delimiter, and is interpreted as a pattern at run-time. The "" is a here-doc with q as the terminating string.

    I certainly wouldn't call this a comment though. Consider the output of this program fragment:

    "copacetic" =~ q/(c[a-z]+)/;
    print "$1\n";
    
    <<q=~q>>;
        This is crap, not a comment!
    q
    
    print "$1\n";
    
    0 讨论(0)
  • 2021-01-11 12:30

    Abigail's answer is partly humorous. There is in fact no << >> operator (not in versions of Perl before 5.22), but there is a (not that well-known, I guess) << operator. Not the binary shift operator, but the unary here-document (heredoc for short). A simple form of it is:

    $long_string = <<EOF;
    This is a long, multiline string.
    It ends when EOF appears alone on a line.
    It will be assigned to the \$long_string variable.
    EOF
    

    This is, in fact, the “multiline comment” feature underlying Abigail's answer — a multiline string literal. The rest is a bit of somewhat obfuscated Perl.

    The bareword or quoted string after << ends the string literal. You can use q as a bareword:

    <<q;
    This is a multiline comment, or rather a string literal whose value is ignored.
    q
    

    To understand the rest of Abigail's snippet, it helps to rewrite the here-document into a simple string literal:

    "This is a multiline comment.\n" =~ q>>;
    

    Ok, now q>> is the q quote-like operator with > as the delimiter character. q>> is equivalent to '' (a non-interpolated literal, which happens to be empty). So the string literal is matched against an empty pattern. The result of that matching is ignored anyway, but this clobbers the match result variables ($1, $&, etc).

    0 讨论(0)
提交回复
热议问题