2013-07-02 21 views
3

基本上,我想抓取动态生成的字符串中命名的变量的内容,但是在严格模式下完成此操作的所有努力都失败了。有几篇关于类似问题的文章,但似乎没有解决方案能为我工作。在Perl的严格模式下使用动态生成的变量名称

这就是我想做的事:

# Fields: 
$q1 = "ex. data 1"; 
$q2 = "ex. data 2"; 
$q3 = "ex. data 3"; 
$q4 = "ex. data 4"; 
$q5 = "ex. data 5"; 

# retrieve the desired field name. q1, q2, q3, q4, or q5. 
$field_name = fetch_the_desired_field_name(); 

# fetch the contents of the named field. ex. data 1, ex. data 2, etc. 
$contents_of_desired_field = $$field_name; 

print $contents_of_desired_field; 

有没有办法在严格模式下做到这一点?在其他关于类似问题的文章中,人们说哈希是答案,但我似乎无法完全理解如何用哈希来做到这一点。 毫无疑问,这是一个非常简单的例子。在实际代码中,有115个可能的字段名称,全部从数据库中提取,含有不可预知的内容。

+0

我几个星期前试过这个,但是不能使它在严格模式下工作。你在PerlMonks上试过这个问题吗? –

回答

6

你不想动态生成变量名!取而代之的是,使用散列或数组:

my @q = ("ex. data 1", ..., "ex. data 5"); 

my $contents = $q[ $some_index ]; 

print $contents; 

$some_index被设定为所需的索引,从而去除任何需要进行动态名称。

11

要使用的哈希做到这一点:

商店:

$myHash{q3} = "ex. data 3"; 

检索:

$result = $myHash{q3}; 

这有多方面的好处,如:

  • 满足“使用严格”;

  • 您可以通过keys %myHash

  • 遍历所有字段名由于字段名列表,按最后一个点,你可以在他们,如果需要做任何其他列表操作(mapgrep)等...

    • 例如,只得到了值,其中字段名称是一种形式的 “q [1-5]”,你可以这样做:

      @subset = @myHash{ grep m/q[1-5]/ keys %myHash }; # Use a slice @{} operator. 
      
    • 大多数数据库API(例如, DBI)有电话从表中查询一行时会自动回复一个哈希的这个确切的格式(或者更确切地说,一个散列引用代替)

      $hash_ref = $sth->fetchrow_hashref; 
      
4

strict明确不允许你使用所谓的“符号引用”。您可以通过询问的Perl许可解决这个问题:

use strict; 
use warnings; 
use 5.10.0; 

our $x = '5'; 
my $field_name = 'x'; 

my $contents; 
{ # no strict is lexially scoped 
    no strict 'refs'; 
    $contents = ${$field_name}; 
} 

say $contents; 

注意引用的变量必须是动态的,不是词汇,而且这种做法一般不提倡。下面是你如何解决你的问题与散列,正确的数据类型:

# Fields: 
my %data = (
    q1 => "ex. data 1", 
    q2 => "ex. data 2", 
    q3 => "ex. data 3", 
    q4 => "ex. data 4", 
    q5 => "ex. data 5", 
); 

# retrieve the desired field name. q1, q2, q3, q4, or q5. 
$field_name = fetch_the_desired_field_name(); 

# fetch the contents of the named field. ex. data 1, ex. data 2, etc. 
$contents_of_desired_field = $data{$field_name}; 

print $contents_of_desired_field; 

那里。没有杂乱的no strict,只有一个变量保存所有的数据。

+0

这似乎是要走的路。谢谢你的回答! – user2543941

+1

这有效,但请记住严格的原因是不允许的:这几乎总是一个非常糟糕的主意。 – Flimzy

+2

@ user2543941我们不能强调这一点:您会后悔使用符号引用。 – darch