如何使用Moose Type作为正则表达式匹配表达式?

时间:2013-03-27 17:47:23

标签: regex perl moose

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

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

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

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

但是我无法正确测试它。如果我在正则表达式斜杠中手动输入我正在寻找的数字,它可以完美地工作。你能帮我使用cardNumber Type吗?

2 个答案:

答案 0 :(得分:5)

Perl的插值规则声明数组("@foo")和标量("$bar"),以及(a)查找哈希值("$baz{bar}")或数组({{1}中的值(b)以前案例的解引用("$foo[1]")被内插到双引号字符串中。

不插入函数调用和每个扩展方法调用。

您可以使用解除引用匿名引用的技巧将任意代码插入到字符串中。通常,您需要一个arrayref:

"@$foo, $$bar, $baz->{bar}, $foo->[1]"

但是标量引用也可以工作(它们长1个字符)。

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

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

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

补充说明:我从该代码段中删除了必要的parens和my $cardNumber = $self->cardNumber; for (@accountsInfo) { if (/\A\Q$cardNumber\E/) { $self->pushing(split /,/); $self->invokeAccount(); } } 提及。另外,我在$_中转义了字符,以便它们与字面匹配,并且不会被视为正则表达式。

答案 1 :(得分:1)

打印它以查看您要匹配的内容。您将获得SOMECLASS=HASH(0x6bbb48)->foo()之类的输出。解决方案:

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