如何组合两个字符串并将结果视为变量的名称?

时间:2014-10-20 19:39:22

标签: perl

如何组合两个字符串并将结果视为变量的名称?

我试过了:

my $container0 = "voila";
my $container1 = "ssss"; 
my $container2 = "swat"; 

my $container3 = int rand 2; 

my $ans = '$container'."$container3"; 

print "$ans"; 

但它打印出来:

$container2

我想打印:

swat

(变量$container2的值)。我怎么能这样做?

2 个答案:

答案 0 :(得分:6)

首先 - 正如评论所说: http://perl.plover.com/varvarname.html

执行此操作的方法是使用哈希。

my %stuff;

$stuff{'container0'} = "voila";
$stuff{'container1'} = "ssss"; 
$stuff{'container2'} = "swat";

my $value = int rand 3;

my $ans = $stuff{'container'.$value};
print $ans,"\n";

(需要3 - int rand 2只会给你1或0)。

但是,这可能比你需要的要复杂一点。

相反:

my @container = qw ( voila ssss swat );
print $container[rand @container],"\n"; 

为了完整起见 - 以下是您可以这样做的方法:

你永远不应该这样做,这是一个可怕的想法!它将以各种令人讨厌的方式打破您的代码,并且在您拥有隐藏的情况下完全是冗余的

$container0 = "voila";
$container1 = "ssss"; 
$container2 = "swat"; 

$container3 = int rand 3; 

$ans = 'container'."$container3"; 

print $$ans,"\n"; 

这会在strictwarnings下出现错误。

Can't use string ("container1") as a SCALAR ref while "strict refs" in use

这是有充分理由的。我认真的,无法重复,当你有完美的哈希值时,这是多么可怕的想法。有各种各样令人难以置信的时髦方法,在代码中破坏随机变量可能会带来灾难性的错误。说真的 - 阅读上面的链接。它有一些可爱的例子。最好的情况是,如果您不小心篡改了某些special变量,例如$*$/,并搞砸了程序其余部分中的每个正则表达式或文件句柄,那么您就是这样做的。我会在错误的地方寻找错误的来源。

修改:要从评论中继续播放 - 如果您这样做,则无法使用my - 您需要使用our。理解原因的最简单方法就是假设my将变量重命名为函数唯一名称,并隐藏'它来自包装的其余部分。因为符号ref在 run 时评估 - perl在进行编译和验证阶段时无法预先准备,所以不能'看'看'看''看''''''''''''' 39;它运行时的词法范围变量。

使用our会在更广泛的范围内声明变量(例如,实际上是全局的)。所以这样:(但它仍然令人讨厌)

use strict;
use warnings;

no strict "refs"; 

our $container0 = "voila";
our $container1 = "ssss"; 
our $container2 = "swat"; 

my $container3 = int rand 3; 

my $ans = 'container'."$container3"; 

print $$ans,"\n"; 

另请参阅常见问题解答以了解更多原因,这不是一个好主意:

http://perldoc.perl.org/perlfaq7.html#How-can-I-use-a-variable-as-a-variable-name%3f

答案 1 :(得分:2)

这里的术语存在问题,其中术语"解释"使用:

在回答您的问题时,您可以使用:

print eval ( $ans );

print "@{[ eval ( $ans ) ]}";

这里有一个很好的总结:http://www.perlmonks.org/?node_id=408346,它还建议使用String::Interpolate作为另一种解决方案。