- ベストアンサー
パターンマッチ
The remained line is shown below. Outline Lab's file A and B ファイルの中身は上記のようになっています。 サブルーチンを作り、パターンマッチで1行目以外を新しいarrayに入れようとしています。 以下のように書きましたが、空白行を選択してしまいます。どうしたら目的のように動くようになりますか? 宜しくお願い致します。 use strict; my @new_line = skip(@input) sub skip { my @lines = @_; my @skip = ("Outline", "Lab\'s\sfile", "A\sand\sB"); foreach my $line(@lines) { my $word = join ("|", @skip); if ($word =~ /^\$line$/) { push @new_line, $line; } } return @nnew_line; }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>my $word = join ("|", @skip); >if ($word =~ /^?$line$/) { これですと、 文字列Outline|Lab'ssfile|AsandsBが、パターン/The remai(略)/等にマッチするかになっちゃうような。 自分が書くと、こんな感じ: use strict; sub skip { my @skip = ("Outline", "Lab's file", "A and B"); my $patstr = '^'.join( '$|^', @skip ).''; my $re = qr/$patstr/; return grep { $_ =~ $re } @_; } my $i = 0; for ( &skip( <> ) ){ $i++; print $i,'.',$_; }
その他の回答 (1)
- qtea
- ベストアンサー率77% (38/49)
>my @skip = ("Outline", "Lab\'s\sfile", "A\sand\sB"); \sは、\\sとします。 >if ($word =~ /^\$line$/) { $wordと$lineが逆だと思います。($の前の\はいらない) ついでに、oオプションとつけたほうが、ちょっと早くなるかも。 if ($line =~ /^$word$/o) { >return @nnew_line; 変数名がちょこっと間違っているような… return @new_line; あと、 >my $word = join ("|", @skip); これは、foreach文の外の方が、ほんのちょっと早くなるかも。