gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:19:16 26 4
gpt4 key购买 nike

假设num是一个数组,

@num = (1 .. 10);

为了找到它的长度,我们使用下面的表达式,

$num = @num;

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

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

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

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

对于上面的作业,我得到了 1。

虽然 $num 的值仍然是 10,请解释以上两个赋值中发生了什么。

最佳答案

您已经在工作中发现了一些 Perl 魔法。 range operator (又名触发器运算符,如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)并发出未初始化的警告。当$.未初始化(即当文件已打开并在程序之前的某处读取时)它返回 true 或 false,或者在这种情况下为 1或空字符串。在你的情况下,它似乎返回 1 , 然后导致

$num[1 .. 6]

..评估

$num[1]

返回元素编号 1,即 2 .

所以,简而言之:声明 1 .. 6根据上下文有不同的含义。在列表上下文中,它返回 1,2,3,4,5,6 ,即整数范围。在标量上下文中,如果 1 返回真 ( $. ) (行数)变量在 1 或 6 之间,否则返回 false(空字符串)。

文档中提到了这种现象:

In list context, it returns a list of values counting (up by ones) from the left value to the right value.

[ ... ]

In scalar context, ".." returns a boolean value. The operator is bistable, like a flip-flop, and emulates the line-range (comma) operator of sed, awk, and various editors.

关于perl - Perl 中的赋值运算符 (=) 在内部是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15742765/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com