3

所以,我相信这与数组和列表之间的区别有关,但我不明白这里发生了什么。谁能解释一下 Perl 如何以及为什么将表达式 like与and(1..4)区别对待?(1, 2, 3, 4)@{[1..4]}

$ perl -de1

Loading DB routines from perl5db.pl version 1.31
Editor support available.

Enter h or `h h' for help, or `man perldebug' for more help.

main::(-e:1): 1
  DB<1> x scalar (1,2,3,4)
0  4
  DB<2> x scalar (1..2,3,4)
0  4
  DB<3> x scalar (1,2..3,4)
0  4
  DB<4> x scalar (1,2,3..4)
0  ''
  DB<5> sub foo { (1..4) } # (the actual problem case, except 4 would be a variable)
  DB<6> x scalar foo()
0  ''
  DB<7> sub bar { @{[1..4]} } # (the workaround)
  DB<8> x scalar bar()
0  4
4

1 回答 1

11

生成列表的“范围运算符”在标量上下文中不存在..——在标量上下文中使用的运算符是“触发器运算符”。触发器运算符开始返回 false,继续返回 false,直到其左侧参数变为 true,然后继续返回 true,直到其右侧参数变为 true,之后它返回 false 并返回其初始状态。如果所有这些听起来毫无用处,请考虑

while (<>) {
  print if /BEGIN/ .. /END/;
}

..操作符一开始是假的,所以文件中的行不会被打印出来。但是一旦正则表达式/BEGIN/匹配,触发器就会变为真,并且将打印以下所有行,直到正则表达式/END/匹配。从“END”之后的行开始,触发器将再次为假。所以效果是只打印(包括,但你可以控制)“BEGIN”和“END”之间的行。

如果任何一方保持不变,就会有更多的魔力$.,但这并不重要。阅读perldoc perlop中有关触发器运算符的更多信息。

于 2010-07-29T21:56:13.130 回答