我想问的是很容易看到的。
想象一下名为
的2个变量my ($foo, $bar) = (0,0);
和
my @a = ("foo","bar","beyond","recognition");
是否可以将匹配$a[0]
与名为$foo
的变量进行字符串匹配,并为其指定一个值(例如" hi")它匹配相同吗?
我正在尝试调试一些代码(不是我的),我遇到了困难。基本上,我有一部分脚本,我有一堆变量。
my ($p1, $p2, $p3, $p4)= (0,0,0,0); # *Edited*
my @ids = ("p1","p2","p3","p4")
我有一种情况需要将每个变量作为哈希键传递给循环中的某个操作。
for (0..3){
my $handle = get_my_stuff(@ids);
my $ret = $p1->do_something(); # <- $p1 is used for the first instance of loop.
...
...
...
}
对于循环的第一次迭代,我需要使用$p1
,但对于循环的第二次迭代,我需要传递(或调用)
my $ret = $p2->do_something(); # not $p1
所以我做的是;
my $p;
for (1..4){
my $handle = get_my_stuff(@ids);
no strict 'refs';
my $ret = $p{$_}->do_something();
...
...
...
use strict 'refs';
...
}
但是上面的操作是不允许的,我无法以这样的方式调用我的密钥:(。事实证明,在get_my_stuff()
被调用后不久,$ p1就变成了一个有福的哈希。我最大的惊喜,不知何故,函数中的脚本(太多而且太长而无法粘贴)只有匹配时才会为我的变量分配或传递哈希引用。
答案 0 :(得分:5)
您不需要尝试创建一些处理变量名称的东西。您使用哈希的想法是正确的,但您的方法存在缺陷。
似乎你的函数get_my_stuff
获取了一个参数列表并以某种方式转换它们。然后它返回与参数对应的对象列表。而不是在循环中执行此操作,而是在循环编号之前执行此操作,并通过将每个id分配给对象来构建哈希。
Perl允许您分配给哈希切片。在这种情况下, sigil 会更改为@
。我的下面的实现使用DateTime和years来显示对象是不同的。
use strict;
use warnings;
use feature 'say';
use DateTime;
# for illustration purposes
sub get_my_stuff {
return map { DateTime->new( year => (substr $_, 1) + 2000 ) } @_;
}
my @ids = qw(p1 p2 p3 p4);
my %p;
# create this outside of the loop
@p{@ids} = get_my_stuff(@ids);
foreach my $i ( 1.. 4 ) {
say $p{'p' . $i}->ymd; # "do_something"
}
这将输出
2001-01-01
2002-01-01
2003-01-01
2004-01-01