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

Perl: How do I get the value of a variable in a loop if it is in a1 a2 a3 format

基本上我试图访问 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 ..

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

感谢您的帮助!

你可以像这样绕过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;
    }
} 

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

如果您想避免关闭 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 在评论中建议的更具可读性的版本

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

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";
}

您在这里所做的称为符号引用,这是一个非常糟糕的主意。

请看这篇文章: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 来代替。 (所以你总是有正确的号码)。

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