@values = (1..5);
foreach $s(@values){
print "$s\n"; #It works
}
print "$_\n",foreach (@values); #It also works
print "$s\n",foreach $s(@values); #It not works
如何提供变量名称? 代码上方不打印。它显示语法错误。 如何在,分隔语法中给出foreach概念的名称。我怎么能这样做??
答案 0 :(得分:8)
使用for
时,无法为statement modifier循环迭代器分配变量名称:
语句修饰符
任何简单的语句都可以选择后跟一个SINGLE修饰符,就在终止分号(或块结尾)之前。可能的修饰符是:
... for LIST foreach LIST ...
for(each)
修饰符是一个迭代器:它为LIST中的每个项目执行一次语句(依次为每个项目添加$_
别名)。print "Hello $_!\n" for qw(world Dolly nurse);
相反,如上所述,您必须使用$_
变量:
@values = (1..5);
print "$_\n" for @values;
如果要为迭代器使用变量名,那么只需使用长形式的for(each)
:
for my $var (@values) {
print "$var\n";
}
答案 1 :(得分:4)
my @values = (1..5);
print "$_\n" foreach (@values);
__END__
1
2
3
4
5
如果确实希望将变量命名为$s
,则可以执行以下操作:
my @values = (1..5);
print "$s\n" while($s = shift @values);
但第一种方法更具惯用性和可读性。
答案 2 :(得分:2)
其他答案是正确的,您不能在for语句修饰符中声明迭代器的名称。但是这里有一种方法可以在一行中使用命名变量获得类似的效果。
perl5i提供了许多语言增强功能,包括此功能......
use perl5i::2;
@a->foreach(func($s) { say $s });
# Similar to...
print "$_\n" for @a;
这也适用于grep,map和众所周知的正确使用"每个"。
%h->each(func($key, $val) { say "$key => $val" });
你也可以成对,三胞胎等工作......
@a->foreach(func($this,$that) { say "$this, $that" });
性能可能会受到影响,因为perl5i会对每次迭代进行完整的函数调用,而不仅仅是更便宜的块条目。
答案 3 :(得分:1)
虽然由于可读性问题我不建议这样做,但您可以暂时将另一个全局变量别名为_
变量。
{
our $s;
local *s = *_;
print "$s\n" for 1, 2, 3;
}
答案 4 :(得分:1)
您使用do
块并在块内重新分配$_
变量:
@values = (1..5);
do { $s = $_; print "$s\n" },foreach (@values);