如何使用带有postfix foreach的命名迭代器?

时间:2014-08-20 17:50:24

标签: perl

@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概念的名称。我怎么能这样做??

5 个答案:

答案 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);