基本上我正在尝试访问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 ..
。
我不能做什么: 我知道这种情况可以用哈希来处理。但我对变量命名没有任何控制权,因此我不能使用哈希或更改变量格式。
感谢您的帮助!
答案 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;
}
}
我认为这不是一个好主意!