Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl:优先级(向左列表运算符)_Perl - Fatal编程技术网

Perl:优先级(向左列表运算符)

Perl:优先级(向左列表运算符),perl,Perl,在编写Perl pg 90时,他说: @ary = (1, 3, sort 4, 2); print @ary; 排序右侧的逗号在排序之前求值,而左侧的逗号在…之后求值。。。列表运算符容易被吞下。。然后表现得像一个简单的词“ 赋值是否导致正在处理排序,还是在通过打印扩展@ary时发生排序 他所说的“逗号”是什么意思?我的理解是,在赋值语句中,逗号的优先级比列表运算符低,因此排序首先运行,并吞噬它的参数(4和2)。逗号到底是如何计算的?这样statement就变成了(1,3,2,4

在编写Perl pg 90时,他说:

   @ary = (1, 3, sort 4, 2);
    print @ary;
排序右侧的逗号在排序之前求值,而左侧的逗号在…之后求值。。。列表运算符容易被吞下。。然后表现得像一个简单的词“

  • 赋值是否导致正在处理排序,还是在通过打印扩展
    @ary
    时发生排序
  • 他所说的“逗号”是什么意思?我的理解是,在赋值语句中,逗号的优先级比列表运算符低,因此排序首先运行,并吞噬它的参数
    (4和2)
    。逗号到底是如何计算的?这样statement就变成了(1,3,2,4)一个被分配的列表..逗号只是作为一个列表分隔符,而不是一个运算符!!事实上在第108页他说:不要把逗号的标量上下文用法和列表上下文用法混淆起来
  • 什么是向左和向右列表运算符?
    print@ary
    是向右列表运算符,所以优先级很低

    打印($foo,退出)

  • 这里,优先级是如何计算的?print是一个列表运算符,看起来像一个函数,所以它应该首先运行!它有两个参数
    $foo
    exit
    。那么为什么exit不被视为字符串呢???毕竟优先级较高的print(列表运算符)具有更高的优先级

    print $foo, exit;
    
    这里有print和,运算符,但list运算符具有更高的优先级..因此..exit应被视为字符串-为什么不

       print ($foo & 255) + 1, "\n";
    
    在这里,由于它是一个列表操作符,所以它会打印
    $foo&255
    ,上面提到的
    exit
    东西不应该发生类似的情况

  • sort
    在调用时进行计算,它实际上与赋值无关。
    sort
    返回一个列表。因此,您要赋值的是:

    @ary=(1,3,(2,4))

  • Perl忽略了第二个括号,因此您最终得到了预期的
    1,3,2,4

  • 您所指的逗号已不存在。它是排序的第二个参数。Perl将您的列表视为3项列表而不是4项列表(在赋值中它将其扩展为4项)

  • 向右对参数执行某些操作(例如打印或存储参数),向左对参数执行某些操作,通常通过某种方式对其进行修改

  • print
    的作用类似于Perl中的任何其他函数(或我在这方面使用过的任何其他语言)。如果将函数作为参数调用,则该函数的返回值将作为参数给出。因此:

    print ($foo, exit);
    
    或同等品(帕伦夫妇不重要)

    什么也不做,因为您要求它打印退出的返回值。您的程序首先退出,所以您什么也得不到。我不明白为什么您希望
    exit
    被视为字符串。
    exit
    在所有上下文中都是函数,除非您引用它

    print ($foo & 255) + 1,"\n";
    
    从给出此示例的
    perlop

    乍一看可能没有达到你的预期。括号 将要计算的“print”的参数列表括起来(打印 “$foo&255”的结果。然后将一个添加到 “打印”(通常为1)。结果如下:

    要正确地执行您的意思,您必须写:


    如果对Perl如何解析构造有疑问,可以通过
    B::Deparse
    模块运行代码,该模块将从编译的内部表示生成Perl源代码。对于第一个示例:

    $ perl -MO=Deparse,-p -e '@ary = (1, 3, sort 4, 2); print @ary;'
    (@ary = (1, 3, sort(4, 2)));
    print(@ary);
    -e syntax OK
    
    如您所见,
    sort
    将这两个参数移到右边

    就执行顺序而言,您可以通过
    B::简明
    模块(我已经添加了注释)了解到这一点:


    不确定下面的内容是否完全准确(这是来自IRC、上面提到的答案、谷歌和我对这本书的解释的一个混乱)

  • (运算符)(操作数)这被视为左向运算符,因为它位于操作数的左侧。(操作数)(运算符)这被视为右向运算符,因为它位于操作数的右侧。因此,(1,2,3,排序4,5,排序6,7)这里的第二个排序,同时充当左字和右字运算符!!排序6,7是左字,在(6,7)的左边-它是操作数。它也在排序(4,5)的右边,所以这里它是向右的,优先级很低

  • 2. @ary=(1,3,排序4,2); 打印@ary

    这里,sort是一个向左的列表操作符,所以它的优先级是最高的,正如“Cfreak”所说

  • 打印($foo,退出);打印$foo,退出
  • 这里,print是左向列表,所以优先级最高,所以它应该首先执行,但要执行它,应该解析它的参数和裸字“exit”。要解析它,我猜它运行exit,因此..print$foo…将吞噬它的所有参数,然后它必须处理它们,然后在裸字上运行它

  • print($foo&255)同上。print获得最高优先级,但现在需要解析其各种参数。因此,$foo&255等,如“Cfreak”所述

  • 非常感谢大家!

    为什么不像我们这些普通人那样使用括号呢?
    exit
    在许多常见的上下文中都是有效的空话:
    $foo{exit}=…
    ,例如。但是Perl总是将一个纯文字参数转换为
    打印
    ,并尝试将其解析为函数。@mob:不是函数,而是文件句柄。
    Perl-Mstrict-le'print xyzy'
    嗨,谢谢!我发现这两个答案都非常有用!而且非常有用!但它们不是我想要的。我在我的文章中已经回答过了完整性方面我有自己的想法,但我会同意Eric的答案,因为我不知道那个模块。
    1 + 1, "\n";    # Obviously not what you meant.
    
    print(($foo & 255) + 1, "\n");
    
    $ perl -MO=Deparse,-p -e '@ary = (1, 3, sort 4, 2); print @ary;'
    (@ary = (1, 3, sort(4, 2)));
    print(@ary);
    -e syntax OK
    
    $ perl -MO=Concise,-exec -e '@ary = (1, 3, sort 4, 2); print @ary;'
    1  <0> enter 
    2  <;> nextstate(main 1 -e:1) v:{
    3  <0> pushmark s       # start of list
    4  <$> const[IV 1] s    # 1 is added to list
    5  <$> const[IV 3] s    # 3 is added to list
    6  <0> pushmark s       # start of sort's argument list
    7  <$> const[IV 4] s    # 4 is added to sort's argument list
    8  <$> const[IV 2] s    # 2 is added to sort's argument list
    9  <@> sort lK          # sort is run, and returns its list into the outer list
    a  <0> pushmark s
    b  <#> gv[*ary] s
    c  <1> rv2av[t2] lKRM*/1
    d  <2> aassign[t3] vKS/COMMON  # the list is assigned to the array
    e  <;> nextstate(main 1 -e:1) v:{
    f  <0> pushmark s         # start of print's argument list
    g  <#> gv[*ary] s         # the array is loaded into print's argument list
    h  <1> rv2av[t5] lK/1
    i  <@> print vK           # print outputs it's argument list
    j  <@> leave[1 ref] vKP/REFC
    -e syntax OK
    
    $ perl -MO=Deparse,-p -e 'print $foo, exit;'
    print($foo, exit);
    -e syntax OK
    
    $ perl -MO=Concise,-exec -e 'print $foo, exit;'
    1  <0> enter 
    2  <;> nextstate(main 1 -e:1) v:{
    3  <0> pushmark s
    4  <#> gvsv[*foo] s   # add $foo to the argument list
    5  <0> exit s         # call `exit` and add its return value to the list
    6  <@> print vK       # print the list, but we never get here
    7  <@> leave[1 ref] vKP/REFC
    -e syntax OK
    
    $ perl -MO=Deparse,-p -e 'print ($foo & 255) + 1, "\n";'
    ((print(($foo & 255)) + 1), '???');  # '???' means this was optimized away
    -e syntax OK
    
    $ perl -MO=Concise,-exec -e 'print ($foo & 255) + 1, "\n";'
    1  <0> enter 
    2  <;> nextstate(main 1 -e:1) v:{
    3  <0> pushmark v
    4  <0> pushmark s
    5  <#> gvsv[*foo] s
    6  <$> const[IV 255] s
    7  <2> bit_and[t2] sK
    8  <@> print sK
    9  <$> const[IV 1] s
    a  <2> add[t3] vK/2
    b  <@> list vK
    c  <@> leave[1 ref] vKP/REFC
    -e syntax OK