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 に答える