perl - Perl 5 中存在哪些伪运算符?

标签 perl operators

我目前正在记录 Perl 5 的所有操作符(请参阅 perlopref GitHub 项目)并且我决定也包括 Perl 5 的伪操作符。对我来说,Perl 中的伪运算符是任何看起来像运算符的东西,但实际上不仅仅是一个运算符或其他一些语法。我已经记录了我已经熟悉的四个:

  • ()= countof 运算符
  • =()=山羊/计数运算符
  • ~~标量上下文运算符
  • }{爱斯基摩接吻运算符

  • 这些伪运算符还有哪些其他名称,您知道我遗漏了哪些伪运算符吗?
    =head1 Pseudo-operators
    
    There are idioms in Perl 5 that appear to be operators, but are really a
    combination of several operators or pieces of syntax. These pseudo-operators
    have the precedence of the constituent parts.
    
    =head2 ()= X
    
    =head3 Description
    
    This pseudo-operator is the list assignment operator (aka the countof
    operator).  It is made up of two items C<()>, and C<=>.  In scalar context
    it returns the number of items in the list X.  In list context it returns an
    empty list.  It is useful when you have something that returns a list and
    you want to know the number of items in that list and don't care about the
    list's contents.  It is needed because the comma operator returns the last
    item in the sequence rather than the number of items in the sequence when it
    is placed in scalar context.
    
    It works because the assignment operator returns the number of items
    available to be assigned when its left hand side has list context.  In the
    following example there are five values in the list being assigned to the
    list C<($x, $y, $z)>, so C<$count> is assigned C<5>.
    
        my $count = my ($x, $y, $z) = qw/a b c d e/;
    
    The empty list (the C<()> part of the pseudo-operator) triggers this
    behavior.
    
    =head3 Example
    
        sub f { return qw/a b c d e/ }
    
        my $count = ()= f();              #$count is now 5
    
        my $string = "cat cat dog cat";
    
        my $cats = ()= $string =~ /cat/g; #$cats is now 3
    
        print scalar( ()= f() ), "\n";    #prints "5\n"
    
    =head3 See also
    
    L</X = Y> and L</X =()= Y>
    
    =head2 X =()= Y
    
    This pseudo-operator is often called the goatse operator for reasons better
    left unexamined; it is also called the list assignment or countof operator.
    It is made up of three items C<=>, C<()>, and C<=>.  When X is a scalar
    variable, the number of items in the list Y is returned.  If X is an array
    or a hash it it returns an empty list.  It is useful when you have something
    that returns a list and you want to know the number of items in that list
    and don't care about the list's contents.  It is needed because the comma
    operator returns the last item in the sequence rather than the number of
    items in the sequence when it is placed in scalar context.
    
    It works because the assignment operator returns the number of items
    available to be assigned when its left hand side has list context.  In the
    following example there are five values in the list being assigned to the
    list C<($x, $y, $z)>, so C<$count> is assigned C<5>.
    
        my $count = my ($x, $y, $z) = qw/a b c d e/;
    
    The empty list (the C<()> part of the pseudo-operator) triggers this
    behavior.
    
    =head3 Example
    
        sub f { return qw/a b c d e/ }
    
        my $count =()= f();              #$count is now 5
    
        my $string = "cat cat dog cat";
    
        my $cats =()= $string =~ /cat/g; #$cats is now 3
    
    =head3 See also
    
    L</=> and L</()=>
    
    =head2 ~~X
    
    =head3 Description
    
    This pseudo-operator is named the scalar context operator.  It is made up of
    two bitwise negation operators.  It provides scalar context to the
    expression X.  It works because the first bitwise negation operator provides
    scalar context to X and performs a bitwise negation of the result; since the
    result of two bitwise negations is the original item, the value of the
    original expression is preserved.
    
    With the addition of the Smart match operator, this pseudo-operator is even
    more confusing.  The C<scalar> function is much easier to understand and you
    are encouraged to use it instead.
    
    =head3 Example
    
        my @a = qw/a b c d/;
    
        print ~~@a, "\n"; #prints 4
    
    =head3 See also
    
    L</~X>, L</X ~~ Y>, and L<perlfunc/scalar>
    
    =head2 X }{ Y
    
    =head3 Description
    
    This pseudo-operator is called the Eskimo-kiss operator because it looks
    like two faces touching noses.  It is made up of an closing brace and an
    opening brace.  It is used when using C<perl> as a command-line program with
    the C<-n> or C<-p> options.  It has the effect of running X inside of the
    loop created by C<-n> or C<-p> and running Y at the end of the program.  It
    works because the closing brace closes the loop created by C<-n> or C<-p>
    and the opening brace creates a new bare block that is closed by the loop's
    original ending.  You can see this behavior by using the L<B::Deparse>
    module.  Here is the command C<perl -ne 'print $_;'> deparsed:
    
        LINE: while (defined($_ = <ARGV>)) {
            print $_;
        }
    
    Notice how the original code was wrapped with the C<while> loop.  Here is
    the deparsing of C<perl -ne '$count++ if /foo/; }{ print "$count\n"'>:
    
        LINE: while (defined($_ = <ARGV>)) {
            ++$count if /foo/;
        }
        {
            print "$count\n";
        }
    
    Notice how the C<while> loop is closed by the closing brace we added and the
    opening brace starts a new bare block that is closed by the closing brace
    that was originally intended to close the C<while> loop.
    
    =head3 Example
    
        # count unique lines in the file FOO
        perl -nle '$seen{$_}++ }{ print "$_ => $seen{$_}" for keys %seen' FOO
    
        # sum all of the lines until the user types control-d
        perl -nle '$sum += $_ }{ print $sum'
    
    =head3 See also
    
    L<perlrun> and L<perlsyn>
    
    =cut
    

    最佳答案

    不错的项目,这里有几个:

    scalar x!! $value    # conditional scalar include operator
    (list) x!! $value    # conditional list include operator
    'string' x/pattern/  # conditional include if pattern
    "@{[ list ]}"        # interpolate list expression operator
    "${\scalar}"         # interpolate scalar expression operator
    !! $scalar           # scalar -> boolean operator
    +0                   # cast to numeric operator
    .''                  # cast to string operator
    
    { ($value or next)->depends_on_value() }  # early bail out operator
    # aka using next/last/redo with bare blocks to avoid duplicate variable lookups
    # might be a stretch to call this an operator though...
    
    sub{\@_}->( list )   # list capture "operator", like [ list ] but with aliases
    

    关于perl - Perl 5 中存在哪些伪运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2897853/

    相关文章:

    c++ - 一元运算符具有关联性是否有意义?

    c - 即使参数是函数调用,C 也会使用短路求值吗?

    perl - 如何将默认 perl 安装更改为 macports 安装的安装

    perl - Mojolicious 自动启动/init() 子例程

    Perl - 使用指定子目录中的所有模块并自动解决它的依赖关系

    java - 'else if'语句中的逻辑运算符

    python - 在 python 中重载增强算术赋值

    windows - 使用 Strawberry Perl 5.16.2.2(64 位)安装模块

    perl - 如何使用 Perl 的 Net::LDAP 进行复杂查询?

    c++ - -> 和 . 之间的区别。对于成员选择运算符