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

Perl 是否可以匹配字符串$x=";"富",;使用名为$foo的变量并仅在匹配时赋值?,perl,Perl,我想问的问题很容易表现出来 想象两个名为 my ($foo, $bar) = (0,0); 及 是否可以将$a[0]与名为$foo的变量进行字符串匹配,并仅当其匹配相同时才为其赋值(如“hi”) 我试图调试这段代码(不是我的),但我遇到了一个难题。基本上,我有脚本的一部分,其中有一堆变量 my ($p1, $p2, $p3, $p4)= (0,0,0,0); # *Edited* my @ids = ("p1","p2","p3","p4") 我有一个例子,我需要将这些变量中的每一个作为散

我想问的问题很容易表现出来

想象两个名为

my ($foo, $bar) = (0,0);

是否可以将
$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.
    ...
    ...
    ...
 }
所以我做的是,

my $p;
for (1..4){
    my $handle = get_my_stuff(@ids);
    no strict 'refs';
    my $ret    = $p{$_}->do_something();
    ...
    ...
    ...
    use strict 'refs';
    ...
  }

但是上面的操作是不允许的,我无法以这种方式调用我的密钥:(.事实证明,$p1在调用
get\u my\u stuff()
后很快就变成了一个幸运的散列。令我最大的惊讶是,不知怎的,函数中的脚本(太多太长,无法粘贴到这里)只有当变量匹配时,才将哈希引用分配或传递给我的变量。

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

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

Perl允许您分配一个哈希片。在这种情况下,sigil将更改为
@
。下面的实现使用带有年份的DateTime来表示对象不同

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

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

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

Perl允许您分配一个哈希片。在这种情况下,sigil将更改为
@
。下面的实现使用带有年份的DateTime来表示对象不同

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

my($p1,$p2,$p3,$p4)=0 x 4;
$p1
设置为
“0000”
,所有其他设置为
未定义
$p{$}->…
指的是
%p
,而不是
$p
。你的最后一个代码块毫无意义。所以
$p1
等等都是对象。而
获取我的东西
会获取一个名称列表,并返回一个与这些名称对应的对象列表?你为什么在列表中调用它?这是我的一个错误。我的本意是
($p1、$p2、$p3、$p4)=(0,0,0,0)
。我试图保持它与原始代码的编写方式相似。只更改了变量名称。请回答您的问题并解决这些问题。如果您没有显示真正的代码,或者至少是您测试过的代码,并且生成了您声称的结果,那么这是没有用的。使用哈希。如果可以,请使用哈希。您说您正在调试的东西不是您的,因此,我不知道您可以/愿意做什么样的修改。如果您真的想按名称引用,那么我想这就回答了您的问题:您试图做的是所谓的符号引用。它不被认为是PBP(Perl最佳实践)。请改为使用哈希。
my($p1,$p2,$p3,$p4)=0 x 4;
$p1
设置为
“0000”
并将所有其他设置为
undef
$p{$}->…
指的是
%p
,而不是
$p
。你的最后一个代码块毫无意义。所以
$p1
等等都是对象。而
获取我的东西
会获取一个名称列表,并返回一个与这些名称对应的对象列表?你为什么在列表中调用它?这是我的一个错误。我的本意是
($p1、$p2、$p3、$p4)=(0,0,0,0)
。我试图保持它与原始代码的编写方式相似。只更改了变量名称。请回答您的问题并解决这些问题。如果您没有显示真正的代码,或者至少是您测试过的代码,并且生成了您声称的结果,那么这是没有用的。使用哈希。如果可以,请使用哈希。您说您正在调试的东西不是您的,所以我不知道您可以/愿意做什么样的修改。如果您真的想按名称引用,那么我想这就回答了您的问题:您试图做的是所谓的符号引用。它不被认为是PBP(Perl最佳实践)。请改用哈希。谢谢。这太棒了:)。我不知道你能用perl做那件事。谢谢。这太棒了:)。我不知道你能用perl做那件事。