Perl中的赋值运算符(=)如何在内部工作?

时间:2013-04-01 11:39:47

标签: perl assignment-operator

假设num是一个数组,

@num = (1 .. 10);

要查找其长度,我们使用以下表达式

$num = @num;

然后我在下面的作业中使用了相同的$num

@slicenum = $num[1 .. 6];

我知道,对于切片数组,我们使用@num而不是$num。它运行良好,没有任何错误。但是当我打印@slicenum的值时,它给了我2个结果。

@slicenum = $num[1 .. 6, 10 .. 20];

对于上述作业,结果我得到了1。

虽然$num的值仍为10,但请解释上述两项任务中发生的情况。

1 个答案:

答案 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和各种编辑器的行范围(逗号)运算符。