如何组合两个字符串并将结果视为变量的名称?
我试过了:
my $container0 = "voila";
my $container1 = "ssss";
my $container2 = "swat";
my $container3 = int rand 2;
my $ans = '$container'."$container3";
print "$ans";
但它打印出来:
$container2
我想打印:
swat
(变量$container2
的值)。我怎么能这样做?
答案 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";
这会在strict
和warnings
下出现错误。
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作为另一种解决方案。