我总是想知道为什么我必须写
foreach my $x (@arr)
而不是
foreach my $x @arr
括号的目的是什么?
答案 0 :(得分:8)
我只能想到一个具体原因。以下代码有效:
for ($foo) {
$_++
}
如果您要将其更改为
for $foo {
$_++
}
那你真的会说
for $foo{$_++}
(即散列查找)。 Perl 6通过改变空格与变量一起工作的方式解决了这个问题(你不能说%foo <bar>
并且它与%foo<bar>
的意思相同)。
答案 1 :(得分:3)
BTW,您可以使用for
的表达式,不带括号,如下所示:
s/foo/bar/ foreach @arr;
或
do { ... } foreach @arr;
答案 2 :(得分:2)
轻率回答:因为Larry 喜欢它的方式在创建Perl 5时喜欢它。
更严肃的答案:有助于消除“迭代@arr
,将每个值放入$x
”(for $x (@arr)
)和“迭代$x
和{{}之间的歧义消除歧义1}},将每个值放入@arr
“($_
)。并且,是的,我意识到后一版本中的额外逗号确实可以在没有问题的情况下消除歧义,但对于人类读者而言,这一点并不那么明显,我希望单靠这一点会导致更多错误。
答案 3 :(得分:0)
Perl有两种类型的函数 - 一种在标量上下文中工作,另一种在列表上下文中工作.'Foreach'在列表上下文中工作,因此括号表示其上下文。
假设一个数组:
@a = (1,2,3);
所以我们可以写 -
foreach my $x (@a)
OR
foreach my $x (1,2,3)
答案 4 :(得分:-1)
David B,
在这种情况下,它们应该是等价的,但是多次括号要么改变执行某些操作的操作顺序,要么改变返回的变量类型(列表)。不同的函数可能以不同的方式处理列表与数组/哈希值。
在foreach循环期间,通常会对列表进行排序:
foreach my $key (sort keys %hash) { ... }
这也可以写成:
foreach my $key (sort(keys(%hash))) { ... }
另一方面,您应该查看列表,数组和哈希之间的区别。列表通常是基本类型,其中散列/数组具有附加功能/能力。某些功能只能在列表上运行,但不能在标量对应物上运行。
我想我也应该补充一下,正如Randal Schwartz(第一本骆驼书的合着者)在之前的引文中指出的那样,“for”循环来自C而“foreach”循环来自Csh。括号内的内容用于确定perl使用的循环。 for / foreach只能互换使用,因为perl会检查()
中的内容,然后确定要使用的构造。