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

时间:2017-12-01 14:26:32

标签: 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';
    ...
  }

但是上面的操作是不允许的,我无法以这样的方式调用我的密钥:(。事实证明,在get_my_stuff()被调用后不久,$ p1就变成了一个有福的哈希。我最大的惊喜,不知何故,函数中的脚本(太多而且太长而无法粘贴)只有匹配时才会为我的变量分配或传递哈希引用。

1 个答案:

答案 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