假设num是一个数组,
@num = (1 .. 10);
要查找其长度,我们使用以下表达式
$num = @num;
然后我在下面的作业中使用了相同的$num
。
@slicenum = $num[1 .. 6];
我知道,对于切片数组,我们使用@num
而不是$num
。它运行良好,没有任何错误。但是当我打印@slicenum
的值时,它给了我2个结果。
@slicenum = $num[1 .. 6, 10 .. 20];
对于上述作业,结果我得到了1。
虽然$num
的值仍为10,但请解释上述两项任务中发生的情况。
答案 0 :(得分:10)
你在工作中发现了一点Perl魔法。这个标量上下文中的range operator(又名触发器操作符为amon指出)..
似乎想要将范围与{{1}进行比较},与整数一起使用时的作用:
$.
如darch所述,$ 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
对下标中的表达式强制使用标量上下文:$a[1 .. 6]
。与使用[ EXPR ]
时相反,而是强加列表上下文。
所以,这部分:
@a[1 .. 6]
在标量上下文中表示1 .. 6
当if ($. >= 1 and $. <= 6)
未初始化时,它会返回$.
(在数值上下文中评估为undef
)并发出未初始化的警告。如果0
未初始化(即文件已在程序中之前的某处打开并读取),则返回true或false,或者在此情况下返回$.
或空字符串。在您的情况下,它似乎返回1
,然后返回
1
..评估
$num[1 .. 6]
返回的是元素编号1,即$num[1]
。
因此,简而言之:声明2
具有不同的含义,具体取决于上下文。在列表上下文中,它返回1 .. 6
,即一系列整数。在标量上下文中,如果1,2,3,4,5,6
(行计数)变量介于1或6之间,则返回true(1
),否则返回false(空字符串)。
以下是文档中提到的这种现象:
在列表上下文中,它返回从左值到右值计数(向上)的值列表。
[...]
在标量上下文中,“..”返回一个布尔值。运算符是双稳态的,就像一个触发器,并模拟sed,awk和各种编辑器的行范围(逗号)运算符。