あなたの習慣について教えてください!!

Perlでgrep -Aのようなことがしたいです。

---------------grep.pl-------------------------------
use strict;
use warnings;

#コマンドライン引数の確認
if(@ARGV != 3){
die "USAGE: \0 [num] [regex] [file]";
}

#数字の読み込み
my $num = $ARGV[0];

#正規表現の読み込み
my $regex = qr/$ARGV[1]/;

#ファイル名の読み込み
my $file = $ARGV[2];

#該当行を保存する配列
my @lines = ();

open my $fh, '<', "$file" or die "$!";
my @file = <$fh>;
close $fh;

for(my $i=0; $i<@file; $i++){
if($file[$i] =~ /$regex/){
push @lines, $file[$i];
for(my $j=1; $j<=$num; $j++){
if($i+$j < @file){
if($file[$i+$j] !~ /$regex/){
push @lines, $file[$i+$j];
}else{
last;
}
}else{
last;
}
}
}
}

foreach my $item (@lines){
print $item;
}
-------------------------------------------------

ところが、正規表現がうまく読み込めません。
perl grep.pl 2 \d{4}\/\d{2}\d{2} test.txt
などとしても、\d{4}\/\d{2}\d{2}の部分が機能しません。
コマンドライン引数から正規表現を指定するにはどうしたらよいでしょうか。

A 回答 (1件)

perlに引数を渡すまえに、shellがエスケープ処理を展開してしまいます。



なので、コマンドラインでは、それを抑止するために、 ' ' で囲む必要があります。
perl grep.pl 2 '\d{4}\/\d{2}\d{2}' test.txt
    • good
    • 0
この回答へのお礼

ありがとうございます。できました。shellについてもっと知りたいです。

お礼日時:2013/11/09 21:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!