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

Proper way to use a Moose class attribute in a regex?

我现在知道访问 Moose class 属性的正确方法是始终通过 Moose.

自动生成的访问器方法

请参阅 to my 了解原因。

然而,这引发了一个新问题...您如何确保 Moose class 属性在正则表达式中得到正确处理?


以下面为例:

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!
}

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

首先,/$compare_age/ 是错误的,因为 23 =~ /2/ 匹配。固定:

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

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

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

购买你应该使用的是:

$age == $person->{age}