在Perl中调用范围运算符(..)的结果上的'标量'

3 perl scalar range flip-flop

所以,我认为这与数组和列表之间的区别有关,但我不明白这里发生了什么.谁能解释如何和为什么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
Run Code Online (Sandbox Code Playgroud)

hob*_*bbs 11

在标量上下文中不存在产生列表的"范围运算符" - ..在标量上下文中使用的运算符是"触发器运算符".触发器操作符开始返回false,继续返回false直到其左参数变为true,然后继续返回true直到其右参数变为true,之后返回false并返回其初始状态.如果所有这些听起来都没用,请考虑一下

while (<>) {
  print if /BEGIN/ .. /END/;
}
Run Code Online (Sandbox Code Playgroud)

..运营商开出假的,所以不会被打印从文件中的行.但是一旦正则表达式/BEGIN/匹配,触发器变为真,并且将打印以下所有行,直到正则表达式/END/匹配.从"END"后面的行,触发器将再次为假.因此效果是只打印(包括但可以控制)"BEGIN"和"END"之间的行.

$.如果任何一方不变,那就更有魔力,但这并不重要.阅读perldoc perlop中触发器操作符的更多信息.