- ベストアンサー
Perlで行頭にある文字が含まれている行を全部削除して詰めたい
perl初心者です。以下のようにデータがならんでいる時、 test111 aaaaaaaaabbbbbbbbcccccc test112 aaaaccccabbbbbbbbcccccc test113 aaaaccaaabbbbbbbbcccccc test114 acccaaaaabbbbbbbbcccccc test111 aacaaaaaabbbbbbbbcccccc test112 accaaaaaabbbbbbbbcccccc test113 aaacccaaabbbbbbbbcccccc test114 aaaaaccaabbbbbbbbcccccc test112の行だけ削除して、さらにそこを詰めたい時のスクリプトを作成しています。 途中からわかりません。 行を削除する関数が調べても見つからないのです。 #!/usr/bin/perl ; open(IN, "test.doc") or die ; open(OUT, ">testout.doc"); while(<IN>) { chomp ; if (/(\S+)/) { $name = $1 ; if ($name =~ /^test112(\S+)/) { #ここでマッチさせて、一気に行を削除して、しかも行を詰めたいのですが ; } print OUT " \n" ; } } close (IN) ; close (OUT) ; 大変困っております。宜しくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
一致しなかったときのみ出力するということで、 while(<IN>){ unless(/^test112/){ print OUT; } } 更に簡単に書くと、 while(<IN>){ print OUT unless(/^test112/); } となります。 削除にこだわるなら、 while(<IN>){ s/^test112\s.+//; print OUT; } あたりでしょうか。 もしくは、明示的に削除したいなら、 while(<IN>){ if(/^test112\s.+/){ $_ = ""; } print OUT; } というふうに、カラの文字列を代入してやるのも、値を削除するときの常套手段ですね。
その他の回答 (2)
- blackdragon
- ベストアンサー率35% (428/1222)
#2です。 >早速以下のスクリプトで実行してみたのですが、 >困ったことに、test112は消えず、しかも改行されていたものが改行されずに打ち出されてしまいました。 まず、test112が消えないのは、print文が、unlessブロック内に入っていませんね。 次に、改行されないのは、chompしたなら、出力時につけてやらないといけませんから、 print OUT "$_\n"; としなくてはなりませんね。
補足
できました~~~~~~~!!!! (*^.^*) 有り難うございましたーーーーーーーー! 本当に助かりました。明日までにできないと困ることになってました。また、ちょくちょく質問させて頂くことになるかとは思いますが、宜しくお願いします。
行を削除する関数はありません。 一度すべてデータを読み込み、"test112" で始まる行を出力しないことで削除を行います。
補足
有り難うございました。 早速以下のスクリプトで実行してみたのですが、 困ったことに、test112は消えず、しかも改行されていたものが改行されずに打ち出されてしまいました。 どこに問題があるのでしょうか? もう一度教えて頂きたいのですが。 宜しくお願いします。 open(IN, "test1109.txt") or die ; open(OUT, ">aftertest1109"); while(<IN>) { chomp ; if (/(\S+)/) { $name = $1 ; # unless ($name =~ /^test112/) { } print OUT; } } close (IN) ; close (OUT) ;