5

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

这就是我想要做的:

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

4

3 回答 3

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;
      
于 2013-07-02T19:43:14.953 回答
7

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

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

my $contents  = $q[ $some_index ];

print $contents;

Where$some_index设置为所需的索引,从而消除了对动态名称的任何需求。

于 2013-07-02T19:41:46.550 回答
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的,只有一个变量保存了所有数据。

于 2013-07-02T19:49:44.027 回答