2024年に成し遂げたこと

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) ;

大変困っております。宜しくお願いします。

A 回答 (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;
}
というふうに、カラの文字列を代入してやるのも、値を削除するときの常套手段ですね。

この回答への補足

有り難うございました。
早速以下のスクリプトで実行してみたのですが、
困ったことに、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) ;

補足日時:2004/11/09 17:13
    • good
    • 0

#2です。



>早速以下のスクリプトで実行してみたのですが、
>困ったことに、test112は消えず、しかも改行されていたものが改行されずに打ち出されてしまいました。

まず、test112が消えないのは、print文が、unlessブロック内に入っていませんね。
次に、改行されないのは、chompしたなら、出力時につけてやらないといけませんから、

print OUT "$_\n";

としなくてはなりませんね。

この回答への補足

できました~~~~~~~!!!!
(*^.^*)
有り難うございましたーーーーーーーー!
本当に助かりました。明日までにできないと困ることになってました。また、ちょくちょく質問させて頂くことになるかとは思いますが、宜しくお願いします。

補足日時:2004/11/09 19:48
    • good
    • 0

 行を削除する関数はありません。


 一度すべてデータを読み込み、"test112" で始まる行を出力しないことで削除を行います。
    • good
    • 1

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

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報