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做那件事。