在Perl的严格模式下使用动态生成的变量名称

时间:2013-07-02 19:37:22

标签: perl variables strict

基本上,我想获取动态生成的字符串中命名的变量的内容,但是在严格模式下完成此操作的所有努力都失败了。有几个关于类似问题的帖子,但似乎没有一个解决方案对我有用。

这就是我想要做的事情:

# 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个可能的字段名称,都是从数据库中提取的,内容不可预测。

3 个答案:

答案 0 :(得分:12)

使用哈希来执行此操作:

商店:

$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;
      

答案 1 :(得分:7)

您不想动态生成变量名称!相反,使用哈希或数组:

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

my $contents  = $q[ $some_index ];

print $contents;

其中$some_index设置为所需索引,因此无需动态名称。

答案 2 :(得分:5)

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,只有一个变量包含所有数据。