在Perl中,如何循环变量名?

时间:2014-08-24 06:28:00

标签: perl for-loop

我有N个数组,我想在单个for循环中打印它们的第一个元素

我的代码:

@arr1=qw(1..5);
@arr2=qw(6..10);
...
@arrN=qw(...);
for($i=1;$i<=$N;$i++)
{
print "$arr[$i][0]";
}

3 个答案:

答案 0 :(得分:5)

当您发现需要知道0 ... N个不同变量的名称时。是时候考虑你可能做错了。

Arrays = 0的列表.N值,可以是顺序的

Hash = 0的列表.. N个命名值

对于您的阵列,除非您真的想要转换为字符串,否则请不要使用qw()只使用裸()

请参阅下面的解决方案,您需要一个数组数组:     #!的/ usr / bin中/ perl的

use strict;
use warnings;

my $n = 10;
my @nArrays;

#fills the nArrays list with array_refs
for my $num(0 .. $n){
  push @nArrays, [($num .. $num+5)]; 
}

#Print out the arrays, one per row, long way
for my $array (@nArrays){
  print $array->[0], "\n";
}

答案 1 :(得分:2)

如果与所有正常建议相反,您将use strict;从脚本中删除,则可以使用:

$N = 3;
@arr1 = (1..5);
@arr2 = (6..10);
@arr3 = (7..12);
@arrs = ("arr1", "arr2", "arr3");
for ($i = 0; $i < $N; $i++)
{
    print "$arrs[$i][0]\n";
}

输出:

1
6
7

绝对不推荐这样做,但它确实有效(主要是出于向后兼容的原因)。

使用use strict;等,您可以使用显式引用:

use strict;
use warnings;

my $N = 3;
my @arr1 = (1..5);
my @arr2 = (6..10);
my @arr3 = (7..12);
my @arrs = (\@arr1, \@arr2, \@arr3);
for (my $i = 0; $i < $N; $i++)
{
    print "$arrs[$i][0]\n";
}

输出:

1
6
7

但总的来说,使用单个数组数组可能会做得更好,也许是这样:

use strict;
use warnings;

my $N = 3;
my @arr = ( [1..5], [6..10], [7..12] );
for (my $i = 0; $i < $N; $i++)
{
    print "$arr[$i][0]\n";
}

输出:

1
6
7

答案 2 :(得分:1)

您所考虑的内容称为symbolic reference,通常不是good idea

如果这些变量的值属于一起,则已经存在一个由整数索引的数据结构:使用数组来保存它们:

use strict;
use warnings;

my @arr = (
   [ 1 .. 5  ],
   [ 6 .. 10 ],
   # ...
   [ 1_000_000 .. 1_000_005 ],
);

for my $i (0 .. $#arr) {
   print $arr[$i][0], "\n";
}