2009-08-03 13 views
6

私は、Getopsを使ってユーザーの入力を受け取り、それに基づいて、ある種のテキストとパターンをマッチさせるか、一致するものをテキストに置き換えようと試みます。Perl qr //と代入

私が抱えている問題は、代用部分を動作させることができないということです。私は、マニュアルページのqr //エントリを見ています:http://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operatorsしかし、私はそれに幸運を持っていないよ。私はこの場合、ドキュメントとまったく同じように自分のコードをモデル化しようとしました。私はマッチパターンをコンパイルし、それを置換に置き換えます。

誰かが間違っていると指摘できますか?

ここ

は、私が見てんだよ(これは個人的な使用のための唯一の小さなスクリプトで、あまりセキュリティを心配しないでください):「私は-rでそれを実行すると

if($options{r}){ 

    my $pattern = $options{r}; 
    print "\nEnter Replacement text: "; 
    my $rep_text = <STDIN>; 

    #variable grab, add flags to pattern if they exist. 
    $pattern .= 'g' if $options{g}; 
    $pattern .= 'i' if $options{i}; 
    $pattern .= 's' if $options{s}; 


    #compile that stuff 
    my $compd_pattern = qr"$pattern" or die [email protected]; 
    print $compd_pattern; #debugging 

    print "Please enter the text you wish to run the pattern on: "; 
    my $text = <STDIN>; 
    chomp $text;  

    #do work and display 
    if($text =~ s/$compd_pattern/$rep_text/){ #if the text matched or whatever 
     print $text; 
    } 
    else{ 
     print "$compd_pattern on \n\t{$text} Failed. "; 
    } 
} #end R FLAG 

/マット/ "-i、そして置換テキスト 'matthew'をテキスト 'matt'に入力すると失敗します。どうしてこれなの?

EDIT:答えの男性のための

ありがとう!それは本当にとても役に立ちました。私はあなたの提案の両方を問題の解決策に結びつけました。私は/ gフラグを少し違って扱わなければなりません。ここでは、作業サンプルは次のとおりです。

if($options{r}){ 

    my $pattern = $options{r}; 
    print "\nEnter Replacement text: "; 
    my $rep_text = <STDIN>; 
    chomp $rep_text; 

    #variable grab, add flags to pattern if they exist. 

    my $pattern_flags .= 'i' if $options{i}; 
    $pattern_flags .= 's' if $options{s}; 

    print "Please enter the text you wish to run the pattern on: "; 
    my $text = <STDIN>; 
    chomp $text;  

    #do work and display 
    if($options{g}){ 
     if($text =~ s/(?$pattern_flags:$pattern)/$rep_text/g){ #if the text matched or whatever (with the g flag) 
      print $text; 
     } 
     else{ 
      print "$pattern on \n\t{$text} Failed. "; 
     } 
    } 
    else{ 
     if($text =~ s/(?$pattern_flags:$pattern)/$rep_text/){ #if the text matched or whatever 
      print $text; 
     } 
     else{ 
      print "$pattern on \n\t{$text} Failed. "; 
     } 
    } 
} #end R FLAG 

答えて

11

カオスが指摘するように、qr//を使用するといくつかの問題が発生します。実際にパターンをプリコンパイルする必要がありますか?あなたは、このようなアプローチを使用して検討するかもしれない:そうでない場合は、このような戦略はうまくいくかもしれない:あなたの新しいコードに応じて

my $pattern  = 'matt'; 
my $text   = 'Matt'; 
my $rep_text  = 'Matthew'; 
my $pattern_opts = 'i'; 

print $text, "\n" if $text =~ s/(?$pattern_opts:$pattern)/$rep_text/; 

更新

my ($orig, $patt, $rep, $flags) = qw(FooFooFoo foo bar ig); 

my $make_replacement = $flags =~ s/g//  ? 
    sub { $_[0] =~ s/(?$flags:$patt)/$rep/g } : 
    sub { $_[0] =~ s/(?$flags:$patt)/$rep/ } 
; 

if ($make_replacement->($orig)){ 
    print $orig; 
} 
else { 
    print "Failed..."; 
} 
+0

'(と非常に良いああ、 ?opts:pat) 'を実行します。私はいつもあなたがそれをすることができることを忘れる。 – chaos

7

-r "matt"、ない-r "/matt/"でそれを実行します。オプション文字列にパターンデリミタを指定する必要はなく、実際にはできません。引用符は、qrの区切り文字です。実際にはmattの周りにスラッシュを入れて、あなたが実行している方法を探しています。これはあなたが望むものではありません。引用符を使って、パターン・ストリングをソース・コードのように扱うようにPerlに指示しようとしていますが、残念ながらそれを行うことはできません。

他のオプションで行っているこれらのパターンの追加は、動作しません。正規表現をコンパイルする方法を変更する必要があります。このような何か/i/sのためにそれを行う可能性があります:/gについては

my $compd_pattern = qr/$pattern/ or die [email protected]; 
$compd_pattern = qr/$compd_pattern/i if $options{i}; 
$compd_pattern = qr/$compd_pattern/s if $options{s}; 

あなたが検索/置換の代替バージョンをサポートする必要があります。 /gqr//の有効な修飾語ではありません。

関連する問題