【问题标题】:In Perl, how can I use a string as a variable name? [duplicate]在 Perl 中,如何使用字符串作为变量名? [复制]
【发布时间】:2011-04-21 18:00:08
【问题描述】:

可能重复:
How can I use a variable as a variable name in Perl?

这可行吗?我需要将一个字符串更改为变量。

例子:

如果我有这样的变量:

$this_is_test = "what ever";
$default = "this";
$default = $default . "_is_test";

我想让$default$this_is_test 的值。

【问题讨论】:

  • 我想我可以使用哈希来解决这个问题。但是我想知道是否还有其他方法。
  • @skimnetser:不,这行不通。这将给出: $default="this_is_test";这是一个字符串。
  • 对不起,我误解了这个问题,试试这个:$default= ${$default.'_is_test'};
  • 这在 SO 上被问了很多:varvarname。也是a Perl FAQ

标签: perl string variables


【解决方案1】:

按照my other answer 的思路,每当您发现自己在变量名中添加字符串后缀时,请改用哈希:

my %this = (
    is_test => "whatever",
    is_real => "whereever",
);

my $default = $this{is_test};

print "$default\n";

不要为此目的使用符号引用,因为它们是不必要的,并且在您的问题上下文中可能非常有害。如需更多信息,请参阅Why it's stupid to 'use a variable as a variable name'?part 2part 3 by mjd

【讨论】:

  • 谢谢,我使用了哈希,但学习其他方法并没有错。顺便说一下,你似乎在哈希键 _is_test 中添加了一个额外的_。
【解决方案2】:

正如 rafl 所说,这可以通过符号引用来实现,但它们非常危险(它们是代码注入向量)并且不适用于词法变量(并且应该使用词法变量而不是包变量)。每当你认为你想要一个符号引用时,你几乎肯定想要一个哈希来代替。而不是说:

#$this_is_test is really $main::this_is_test and is accessible from anywhere
#including other packages if they use the $main::this_is_test form 
our $this_is_test = "what ever";
my $default       = "this";
$default          = ${ $default . "_is_test" };

你可以说:

my %user_vars = ( this_is_test => "what ever" );
my $default   = "this";
$default      = $user_vars{ $default . "_is_test" };

这将%user_vars 的范围限制在创建它的块中,并且将密钥与真实变量隔离限制了注入攻击的危险。

【讨论】:

  • 最后一句好像被截断了。
  • @Sinan Ünür 谢谢,我一定是分心了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
  • 2012-07-18
  • 2017-02-05
  • 2014-07-16
  • 2010-12-05
相关资源
最近更新 更多