2011-12-27 106 views
1

我需要過濾傳遞給屬性「查詢」 的「字符串」,並使用過濾的值創建一個URL。moose perl方法修飾符

我的代碼

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 => '[email protected]#$%#%#@&-**[email protected]@#%!', 
}); 

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

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

輸出這裏:

print $search->query; 

FOO酒吧,符合市場預期。

當我打電話 「create_uri」

print $search->create_uri; 

輸出:

http://localhost/search/[email protected]# $%#%#@ & - **吧@@#%!

「查詢」完全髒! 如何解決這個問題?

回答

0

當您致電print $obj->query時,您正在調用/子程序/被叫查詢,該查詢調用您的around子。當您從create_uri內調用$self->{query}時,您可以訪問/ attribute/called查詢。解決辦法有兩個:

1)更換$self->{query}$self->query

2)而不是使用around query的,請使用屬性,每個屬性設置時它調用一個函數的trigger選項。有關信息,請參閱http://metacpan.org/pod/Moose

+0

謝謝! 我使用了第一個選項。 ,但使用「tiggers」也獲得成功。 – killzone 2011-12-27 13:21:23

2

一對夫婦更多的途徑中爲您探索:

  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

謝謝!這兩種解決方案工作得很好。 我相信使用「脅迫」將效果最好。 我會通過使用「脅迫」而不是「觸發器」獲得一些收益? 'has query => qw {is ro isa Str required 1},trigger => \&_ filter_query;' – killzone 2011-12-28 16:12:07