2013-03-27 22 views
1

我有以下類型在我的類文件:如何使用Moose類型作爲正則表達式匹配表達式?

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

我努力做到以下幾點:

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

但我不能得到正常的測試。如果我手動輸入數字,我正在尋找正則表達式斜槓它完美的作品。你能幫我使用cardNumber類型嗎?

回答

1

打印它看看你想匹配什麼。你會得到像SOMECLASS=HASH(0x6bbb48)->foo()的輸出。 A液:

/^@{[$self->cardNumber()]}/ 
+0

男人我愛你們!完美的作品! – BackPacker777 2013-03-27 18:18:42

5

Perl的內插規則狀態陣列("@foo")和標量("$bar"),以及(a)以散列值的查找("$baz{bar}")或陣列("$foo[1]"),和(b)解除引用之前的案例("@$foo, $$bar, $baz->{bar}, $foo->[1]")被內插到雙引號字符串中。

函數調用和每個擴展方法調用都不是插值的。

通過使用取消引用匿名引用的技巧,可以將任意代碼插入到字符串中。通常,你想要一個arrayref:

"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中的字符,以便它們匹配,字面意思是,並且不被視爲正則表達式。