使用数组时的Perl语法

use*_*572 0 arrays perl

嗨,我正在研究一些基于数组的代码,我得到了以下内容:

@array; #contains lines of text

for (0 .. $#array - 2)
{
   #code here
}
Run Code Online (Sandbox Code Playgroud)

0 ..语法的目的是什么?基于这个例子它会做什么?这与写作foreach(@array -2)有何不同?

TLP*_*TLP 5

..范围运算符.它可以以两种相当不同的方式使用,具体取决于它发生的上下文.在这种情况下,您正在使用列表上下文,在这种情况下您的代码

for (0 .. $#array - 2)
Run Code Online (Sandbox Code Playgroud)

类似于

for (local $_ = 0; $_ <= $#array - 2; $_++)
Run Code Online (Sandbox Code Playgroud)

换句话说,它创造了一系列的数字,从0$#array - 2.

范围运算符也可以在标量上下文中使用,在这种情况下,它会跟踪状态.但这是另一个问题.

这不同于

foreach(@array -2)
Run Code Online (Sandbox Code Playgroud)

请注意,在此表达式中,运算符将数组@array放在标量上下文中-,并返回其大小.它只会为for循环创建一个值,这就是数组的大小减去2.假设列表有10个元素,那么你得到:

foreach (8)
Run Code Online (Sandbox Code Playgroud)

这只是一个项目列表(数字8)的循环,并不是很有用.所以区别很大,而且无法解释,真的.我认为你的意思是:

foreach (@array[0 .. $#array - 2])
Run Code Online (Sandbox Code Playgroud)

这是使用数组切片的循环.在这种情况下,您循环遍历数组的值,而不是索引.例如

for (0 .. $#array) {
    print $array[$_];
}
Run Code Online (Sandbox Code Playgroud)

VS

for (@array) {
    print $_;
}
Run Code Online (Sandbox Code Playgroud)

你可能也注意到,forforeach意味着在Perl完全一样的东西.它们是彼此的别名,它们的工作方式没有区别.