2011-12-27 9 views
1

属性 "query" に渡された "string"をフィルタリングし、フィルタリングされた値を持つ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]# $%#%# - **バー@@#1%!

「クエリ」が完全に汚れています。 これを解決するには?

答えて

0

print $obj->queryに電話すると、aroundサブを呼び出す/サブルーチン/呼び出されたクエリが呼び出されます。 をcreate_uriから呼び出すと、/ attribute/calledクエリにアクセスできます。 2つの解決策があります

1)$self->query

2と$self->{query}を置き換え)する代わりにaround queryを使用するのではなく、関数に属性が設定されるたびに呼び出されます属性上triggerオプションを使用します。詳細については、http://metacpan.org/pod/Mooseを参照してください。あなたが探検するため

+0

ありがとうございます! 私は最初のオプションを使用しました。 でも、 "tiggers"を使って成功を収めています。 – killzone

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

ありがとう! 2つのソリューションは非常にうまく動作します。 私は "強制"を使うのが一番うまくいくと思います。 私は "トリガー"の代わりに "強制"を使用することによっていくつかの利益を得るだろうか? 'query => qw {strが必要です}、trigger => \&_ filter_query;' – killzone

関連する問題