在正则表达式中使用Moose类属性的正确方法?

时间:2015-09-16 15:41:30

标签: regex perl accessor moose

我现在知道访问Moose类属性的正确方法是始终通过Moose自动生成的访问器方法。

请参阅Friedo's answer至我的previous question了解原因。

然而,这提出了一个新问题......如何确保在正则表达式中正确处理Moose类属性?

举例如下:

Person.pm

package Person;

use strict;
use warnings;
use Moose;

has 'name' => (is => 'rw', isa => 'Str');
has 'age'  => (is => 'rw', isa => 'Int');

# Make package immutable
__PACKAGE__->meta->make_immutable;

test.pl

#!/usr/bin/perl

use strict;
use warnings;
use Person;

my $person = Person->new(
    name => 'Joe',
    age  => 23,
);

my $age = 23;

# Access age the "proper" way
if ($age =~ m/$person->age()/) {
    print "MATCH 1!\n";
}

# Access age the "improper" way
if ($age =~ m/$person->{age}/) {
    print "MATCH 2!\n";
}

此代码将输出以下内容:

MATCH 2!

Perl在放入正则表达式时似乎没有正确解析存取方法...处理这个问题的正确方法是什么?

我知道我可以这样做:

my $compare_age = $person->age();
if ($age =~ m/$compare_age/) {
    # MATCH!
}

但是如果没有额外的步骤将它存储在一个单独的变量中,同时仍然通过访问器,我怎么能让它工作?

1 个答案:

答案 0 :(得分:1)

首先,/$compare_age/错误,因为23 =~ /2/匹配。修正:

$age =~ /^\Q$compare_age\E\z/

有一个技巧可以评估双引号字符串文字和正则表达式文字中的任意表达式。

$age =~ /^\Q${\( $person->age() )}\E\z/

购买您应该使用的内容如下:

$age == $person->{age}