1

我的类文件中有以下类型:

has 'cardNumber' => (is => 'ro', isa => 'Int', required => 1);

我正在尝试执行以下操作:

foreach $_ (@accountsInfo) {
      if ($_ =~ m/^$self->cardNumber()/) {
            $self->pushing(split(/,/, $_));
            $self->invokeAccount();
      }
 }

但我无法让它正确测试。如果我在正则表达式斜杠中手动输入我要查找的数字,它会完美运行。你能帮我使用 cardNumber 类型吗?

4

2 回答 2

5

Perl 的插值规则规定,数组 ( "@foo") 和标量 ( "$bar"),以及 (a) 在哈希 ( "$baz{bar}") 或数组 ( "$foo[1]") 中的值查找,以及 (b) 对先前情况的取消引用 ( "@$foo, $$bar, $baz->{bar}, $foo->[1]") 被插值到双引号字符串中。

函数调用和每个扩展方法调用不会被插值。

您可以使用取消引用匿名引用的技巧将任意代码插入字符串。通常,您需要一个数组引用:

"foo @{[ expressions; ]} bar"; # interpolating anon hashref

但标量参考也可以工作(它们长 1 个字符)。

"foo ${\( expressions; )}" # interpolating anon scalar ref

但是,您应该考虑将要插入的值缓存在标量变量中:

my $cardNumber = $self->cardNumber;
for (@accountsInfo) {
  if (/\A\Q$cardNumber\E/) {
    $self->pushing(split /,/);
    $self->invokeAccount();
  }
}

$_附加说明:我从该代码片段中删除了不必要的括号和提及。另外,我对字符进行了转义,$cardNumber以便它们匹配字面意思,并且不被视为正则表达式。

于 2013-03-27T18:17:21.323 回答
1

打印它以查看您要匹配的内容。你会得到像SOMECLASS=HASH(0x6bbb48)->foo(). 一个办法:

/^@{[$self->cardNumber()]}/
于 2013-03-27T18:02:48.537 回答