您已经发现了一些 Perl 魔法在起作用。这个标量上下文中的范围运算符(也就是amon指出的触发器运算符)似乎想要将范围与 进行比较,它在与整数一起使用时会这样做:..
$.
$ perl -lwe '@a = 1..10; @foo = $a[1..6]; print @foo'
Use of uninitialized value $. in range (or flip) at -e line 1.
Argument "" isn't numeric in array element at -e line 1.
1
$ perl -lwe '$x=<>; @a = 1..10; @foo = $a[1..6]; print @foo' somefile.txt
Name "main::x" used only once: possible typo at -e line 1.
2
正如darch 所提到的,$a[1 .. 6]
将标量上下文强加给下标内的表达式:[ EXPR ]
。与使用时相反@a[1 .. 6]
,其中强加了列表上下文。
所以,这部分:
1 .. 6
在标量上下文中意味着if ($. >= 1 and $. <= 6)
当$.
未初始化时,它返回undef
(0
在数字上下文中计算为)并发出未初始化的警告。当$.
不是未初始化时(即当一个文件已经打开并在程序中的某个地方读取时)它返回真或假,或者在这种情况下1
或空字符串。在您的情况下,它似乎返回1
,然后导致
$num[1 .. 6]
..评估为
$num[1]
作为回报,它返回元素编号 1,即2
.
因此,简而言之:该语句1 .. 6
具有不同的含义,具体取决于上下文。在列表上下文中,它返回1,2,3,4,5,6
,即一个整数范围。在标量上下文中,1
如果$.
(行数)变量在 1 或 6 之间,则返回 true (),否则返回 false(空字符串)。
以下是文档中对这种现象的提及:
在列表上下文中,它返回从左值到右值计数(递增)的值列表。
[ ... ]
在标量上下文中,“..”返回一个布尔值。该运算符是双稳态的,就像一个触发器,并模拟 sed、awk 和各种编辑器的行范围(逗号)运算符。