модификаторы метода с Moose Perl - PullRequest
1 голос
/ 27 декабря 2011

Мне нужно отфильтровать «строку», переданную атрибуту «запрос», и создать URL с отфильтрованным значением.

мой код

package Search;

use Any::Moose;

has query    => qw{ is ro isa Str required 1 };

# my method modifiers
around 'query' => sub {
    my $orig = shift;
    my $self = shift;

    my $content = $self->$orig(@_);

    # simple filter
    $content =~ s{[^\w\-\s]}{}gi;

    return $content;
};

sub create_uri {
    my $self = shift;
    my $uri = "http://localhost/search/".$self->{query};
    return $uri;
};
1;

package main;
my $obj = Search->new({
    query  => 'foo@#$%#%#@&-**bar@@#%!',
});

print $obj->query."\n";

print $obj->create_uri."\n"; # BAD

вывод здесь:

print $search->query;

foo-bar, как и ожидалось.

Когда я вызываю "create_uri"

print $search->create_uri;

, вывод:

http://localhost/search/foo@#$%#%#@&-**bar@@#%!

«Запрос» полностью грязный!Как это решить?

Ответы [ 2 ]

2 голосов
/ 28 декабря 2011

Еще пара подходов для изучения:

  1. Используйте метод BUILDARGS в своем классе, чтобы очистить строку запроса, прежде чем она будет присвоена атрибуту при создании.

    sub BUILDARGS {
        my $type = shift;
        my $args = ref $_[0] eq 'HASH' ? shift : {@_};
        $args->{query} =~ s{[^\w\-\s]}{}gi;
        return $args;
    }
    
  2. Используйте приведение типа.

    subtype 'SafeStr', as 'Str', where {!/[^\w\-\s]/};
    
    coerce 'SafeStr', from 'Str', via {
        my $str = $_;
        $str =~ s/[^\w\-\s]//gi;
        return $str;
    };
    
    has 'query' => (
        is => 'ro',
        isa => 'SafeStr',
        required => 1,
        coerce => 1,
    );
    
0 голосов
/ 27 декабря 2011

Когда вы звоните print $obj->query, вы вызываете / подпрограмму / вызываемый запрос, который вызывает вашу подпрограмму around. Когда вы звоните по номеру $self->{query} из create_uri, вы получаете доступ к / атрибуту / вызываемому запросу. Есть два решения:

1) Заменить $self->{query} на $self->query

2) Вместо использования around query, используйте параметр trigger для атрибута, который вызывает функцию каждый раз, когда атрибут установлен. См. http://metacpan.org/pod/Moose для информации.

...