Perl:如果变量是a1 a2 a3格式,我如何在循环中获取变量的值

时间:2015-02-13 07:41:44

标签: perl variables

基本上我正在尝试访问perl程序中的预定义变量。 变量采用a1 a2 a3格式。 我想循环访问它们。在循环中,我将增加后缀标量值

#!/usr/bin/perl
use strict;
use warnings;

my ($a0,$a1,$a2,$a3)= (10,12,14,16);
for(my $i=0; $i<=3; $i++) {
    my $var = ${a$i};
    print $var;
}

我的期望: 当我在循环中打印$var时,我需要先前定义的值10,12 ..

我不能做什么: 我知道这种情况可以用哈希来处理。但我对变量命名没有任何控制权,因此我不能使用哈希或更改变量格式。

感谢您的帮助!

4 个答案:

答案 0 :(得分:4)

如果您想避免关闭strict,可以使用eval

#!/usr/bin/perl
use strict;
use warnings;

my ($a0,$a1,$a2,$a3)= (10,12,14,16);
for(my $i=0; $i<=3; $i++) {
    print eval "\$a$i";
}

更新:在评论

中使用Сухой27建议的更易阅读的版本

答案 1 :(得分:4)

使用数组而不是多个类似命名的变量,因为这是它们的主要用例,

use strict;
use warnings;

my @a = (10,12,14,16);
for my $i (0 .. $#a) {

  my $var = $a[$i];
  print $var, "\n";
}

或者你可以使用标量引用数组

use strict;
use warnings;

my ($a0,$a1,$a2,$a3) = (10,12,14,16);
my @a = \($a0,$a1,$a2,$a3);

for my $i (0 .. $#a) {

  my $var = ${ $a[$i] };
  print $var, "\n";
}

答案 2 :(得分:2)

你在这里所做的是一个象征性的参考,这是一个非常糟糕的主意。

请仔细阅读这篇文章:http://perl.plover.com/varvarname.html

但它的长短是 - 使用变量作为变量名 - 你正在做的 - 是危险和不必要的。它会导致代码中出现各种潜在问题,包括完全不相关的代码中的错误。这就是strict不允许你这样做的原因。

更重要的是 - 它完全没必要,因为perl将hash作为本机数据类型。

而不是代码,请考虑:

my %h;
( $h{0}, $h{1}, $h{2}, $h{3} ) = ( 10, 12, 14, 16 );
foreach my $key ( sort keys %h ) {
    print "$key = $h{$key}\n";
}

现在,它为您的代码添加了几个字符,但通过这样做 - 您创建了一个名为%h的词法范围命名空间。 (我建议将其称为更有意义的个人内容 - 并且绝对避免使用$a$b,因为它们具有特殊含义)。

但是这个命名空间没有冒险践踏代码的其他部分,而且对于奖励积分 - 你不再需要'for'循环,你可以简单地迭代keys。 (所以你总是有正确的号码)。

(或者正如另一位用户建议的那样 - 只使用数组)

答案 3 :(得分:1)

您可以像这样绕动strict对动态变量名称的限制。

#!/usr/bin/perl
use strict;
use warnings;

{    
    no strict 'refs';

    my ($a0,$a1,$a2,$a3)= (10,12,14,16);
    for(my $i=0; $i<=3; $i++) {
    my $var = ${a$i};
    print $var;
    }
} 

我认为这不是一个好主意!