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
来代替。 (所以你总是有正确的号码)。
(或者正如另一位用户所建议的那样 - 只需使用一个数组)
基本上我试图访问 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
来代替。 (所以你总是有正确的号码)。
(或者正如另一位用户所建议的那样 - 只需使用一个数组)