基本上,我想获取动态生成的字符串中命名的变量的内容,但是在严格模式下完成此操作的所有努力都失败了。有几个关于类似问题的帖子,但似乎没有一个解决方案对我有用。
这就是我想要做的事情:
# 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 :(得分:12)
使用哈希来执行此操作:
商店:
$myHash{q3} = "ex. data 3";
提取:
$result = $myHash{q3};
这有很多好处,例如:
满足“使用严格”;
您可以通过keys %myHash
由于字段名称是最后一个点的列表,因此您可以根据需要对它们执行任何其他列表操作(map
,grep
)等...
例如,要仅获取字段名称为“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
,只有一个变量包含所有数据。