所以,我认为这与数组和列表之间的区别有关,但我不会理解这里发生了什么。任何人都可以解释Perl如何以及为什么以(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
答案 0 :(得分:11)
在标量上下文中生成列表的“范围运算符”不存在 - 在标量上下文中使用时..
运算符是“触发器运算符”而不是。触发器操作符开始返回false,继续返回false直到其左参数变为true,然后继续返回true直到其右参数变为true,之后返回false并返回其初始状态。如果所有这些听起来都没用,请考虑
while (<>) {
print if /BEGIN/ .. /END/;
}
..
运算符开始为false,因此不会打印文件中的行。但是一旦正则表达式/BEGIN/
匹配,触发器就变为真,并且将打印以下所有行,直到正则表达式/END/
匹配。从“END”后面的行,触发器将再次为假。因此效果是只打印(包括但可以控制)“BEGIN”和“END”之间的行。
如果任何一方不变,$.
会有更多魔力,但这并不重要。阅读perldoc perlop中触发器操作符的更多信息。