2011-08-07 6 views
3

コマンドラインから正規表現の入力を受け取り、それを処理するスクリプトを作成しています。このような何か:スクリプトにperlを使うと、コマンドライン入力から正規表現をどのように処理するのですか?

chomp(my $regex = $ARGV[0]); 
my $name = '11528734-3.jpg'; 

$name =~ $regex; 

print $name . "\n"; 

私の入力は次のとおりです。「S/.JPG/_thumbnail.jpg/gで」 が、$ nameは、コマンドラインからの正規表現の入力を処理していません。

この方法のアドバイスはありますか?

ありがとうございます!

+0

あなたは正規表現のマッチをしていますが、それが成功したかどうかをチェックしたり、結果を何らかの方法で使用したりしません。 '$ name'に何が起こりたいのですか? – ysth

+1

@ysth:OPに 's/foo/bar /'という形式の引数があり、 '=〜$ regex'が' =〜s/foo/bar/'。 –

+0

あなたの入力が何であるかを追加したので、タイトル/質問が間違っています。あなたはコマンドラインから正規表現を取ろうとしていません、あなたはコマンドラインから_operator_を取ろうとしています。 – tadmc

答えて

7

$name =~ $regexを使用すると、$nameは変更されません。変更を行うには、s///演算子を使用する必要があります。

例えば、

$name =~ s/$pattern/$replacement/; 

あなたが同じ引数で両方パターンおよび交換を指定している場合、例えば、s/foo/bar/の形で、あなたが最初にそれらを分割する必要があります。

my (undef, $pattern, $replacement) = split '/', $regex; 
$name =~ s/$pattern/$replacement/; 

オリジナルの回答:

使用qr//

$name =~ qr/$regex/; 

あなたはまた、単に$name =~ /$regex/を使用することができますが、qrバージョンが、その中であなたが後で使用するために正規表現オブジェクトを格納することができ、より一般的である:

$compiled = qr/$regex/; 
$name =~ $compiled; 
$name =~ s/$compiled/foobar/; 

など

+0

は何の違いもありません。 '=〜$ regex'だけが同じように動作するはずです – ysth

+0

@ysth:その場合、OPの問題は彼が' s /// 'を使用していないということで、文字列は変更されません。 :-) –

+0

文字列を分割することはできますが、何らかの方法があります...さらに、正規表現がスクリプトに送られるものを取り込むためにevalを使う以外にも? オリジナルの質問をスクリプトに入力して更新しました。 –

関連する問題