是否可以将字符串 $x = "foo" 与名为 $foo 的变量匹配,并仅在匹配时才分配值?

  • 本文关键字:foo 分配 字符串 是否 变量 perl
  • 更新时间 :
  • 英文 :


我想问的问题很容易显示出来。

假设 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';
...
}

但是上述操作是不允许的,我无法以这种方式调用我的密钥:(。事实证明,$p 1 在调用get_my_stuff()后不久就变成了一个祝福的哈希。令我最惊讶的是,不知何故,函数中的脚本(太多和太长而无法粘贴到此处)仅在它们匹配时才为我的变量分配或传递哈希引用。

你不需要尝试发明一些东西来处理变量名。你使用哈希的想法是正确的,但你的方法是有缺陷的。

似乎您的函数get_my_stuff接受参数列表并以某种方式转换它们。然后,它返回与参数对应的对象列表。与其在循环中执行此操作,不如在循环数字之前执行此操作,并通过将每个 id 分配给对象来建立哈希。

Perl 允许你分配给一个哈希片。在这种情况下,符号变为@。我下面的实现使用带有年份的日期时间来显示对象是不同的。

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

相关内容

最新更新