この人頭いいなと思ったエピソード

Perl初心者です
アルファイルの一部を別のファイルの指定箇所にかき込みたいのですが、どのようにすればいいのか分かりません。
ファイルAにはデータが1行に1つ入っています。それをファイルBの指定した場所にかき込みたいです。

ファイルBはテキストファイルで

1:3年AaaaA組
2:今週の担当はAbbbA
3:月曜日の1限目はApppA
4:担当の先生はAqqqA
5:持ってくるものはArrrA
6:月曜日の2限目はAsssA
7:担当の先生はAtttA
8:持ってくるものはAuuuA
という具合です。

以下同様のものが数組繰り返します。

AファイルにはA***Aの部分にかき込みたい情報が1行づつのデータになっています。

いろいろ探してみて、見よう見まねで

*************
#test.pl
open(A, "<A.txt");
while (<A>) {
@lines = <>;
}

open(B, ">B.txt");
while (<B>) {
s/AaaaA/$lines[1]/g;
s/AbbbA/$lines[2]/g;
print B;
}
close(B);
close(A);
#end

**********
こんなものをつくってみましたが、さっぱりダメでした。
WIN MEで

*********
jperl test.pl > test.txt
*********
こんなバッチファイルを作成して実行しています。

どなたかお力をお貸し願えるとありがたいです。
よろしくお願いします。

A 回答 (5件)

#4>実行したあとB.txtのファイルの中身が空っぽになってしまう


まさに、危惧していたとおり・・
再度書きますが
B.txt に書き出さない場合は、
open(B, ">B.txt");
print B $B;
close(B);
の部分のopen と close を削除して
print $B;
だけにすればいいです。
#4でいうと
最後の
open(C, ">C.txt");
print $C;
close(C)
のような部分は、C.txt に書き出しをしていないので、
print $C;
だけでいいです。
    • good
    • 0
この回答へのお礼

なるほど、そういうことだったんですね。
重ねて感謝、感謝です、有り難うございました。

お礼日時:2006/06/19 18:55

#3で


>print $B;
>として
としか書いてませんが、
B.txt に書き出さない場合は、
#open(B, ">B.txt");
print $B;
#close(B);
のようにB.txtファイル書き出しに関する部分をコメントアウトするか削除して下さい。

この回答への補足

#3のアドバイスを元にして、実行をさせていただきました。そうすると、実行したあとB.txtのファイルの中身が空っぽになってしまうので、ちょっとだけ下手な工夫をしました。B.txtはテンプレートで再度使うこともあるからです。

以下のバッチファイルを作って実行しました
********
jperl copy.pl B.txt > C.txt
jperl copy.pl B.txt > D.txt
jperl test01.pl > text01.txt
jperl test02.pl > text02.txt
*********
それぞれのファイルの中身は

copy.plが
****************
while(<>)
{
print;
}
# end
****************

test01.plが
*****************
open(A, "<A.txt");
@lines = <A>;
close(A);
chomp @lines;

if(open(C, "<C.txt")){
local $/ = undef;
$C = <C>;
close(C);
}
$C=~ s/AaaaA/$lines[0]/g;
$C=~ s/AbbbA/$lines[1]/g;
$C=~ s/AcccA/$lines[2]/g;
$C=~ s/AdddA/$lines[3]/g;
$C=~ s/AeeeA/$lines[4]/g;
$C=~ s/AfffA/$lines[5]/g;
$C=~ s/AgggA/$lines[6]/g;
$C=~ s/AhhhA/$lines[7]/g;
$C=~ s/AiiiA/$lines[8]/g;
$C=~ s/AjjjA/$lines[9]/g;
$C=~ s/AkkkA/$lines[10]/g;
$C=~ s/AlllA/$lines[11]/g;
$C=~ s/AmmmA/$lines[12]/g;
$C=~ s/AnnnA/$lines[13]/g;

open(C, ">C.txt");
print $C;
close(C)
*******************

test02.plが
********************
open(A, "<A.txt");
@lines = <A>;
close(A);
chomp @lines;

if(open(D, "<D.txt")){
local $/ = undef;
$D = <D>;
close(D);
}
$D=~ s/AaaaA/$lines[14]/g;
$D=~ s/AbbbA/$lines[15]/g;
$D=~ s/AcccA/$lines[16]/g;
$D=~ s/AdddA/$lines[17]/g;
$D=~ s/AeeeA/$lines[18]/g;
$D=~ s/AfffA/$lines[19]/g;
$D=~ s/AgggA/$lines[20]/g;
$D=~ s/AhhhA/$lines[21]/g;
$D=~ s/AiiiA/$lines[22]/g;
$D=~ s/AjjjA/$lines[23]/g;
$D=~ s/AkkkA/$lines[24]/g;
$D=~ s/AlllA/$lines[25]/g;
$D=~ s/AmmmA/$lines[26]/g;
$D=~ s/AnnnA/$lines[27]/g;

open(D, ">D.txt");
print $D;
close(D);

*********************
とうものです。A.txtのデータの数が変わったので、少し扱う行数が変わっています。

きっと、ぶさいくどころではないものだとは思うのですが、これで希望が叶いました。

本当にありがとうございました。

補足日時:2006/06/17 09:01
    • good
    • 0

open(A, "<A.txt");


@lines = <A>;
close(A);
chomp @lines;

if(open(B, "<B.txt")){
local $/ = undef;
$B = <B>;
close(B);
}
$B=~ s/AaaaA/$lines[0]/g;
$B=~ s/AbbbA/$lines[1]/g;
$B=~ s/ApppA/$lines[2]/g;
$B=~ s/AqqqA/$lines[3]/g;
$B=~ s/ArrrA/$lines[4]/g;
$B=~ s/AsssA/$lines[5]/g;
$B=~ s/AtttA/$lines[6]/g;
$B=~ s/AuuuA/$lines[7]/g;

open(B, ">B.txt");
print B $B;
close(B);
----------------------------------------------------------------
B.txt をテンプレートとして使っていて置き換える必要がなく、
置き換えた結果をtest.txt として得るのであれば、
print B $B;
は、
print $B;
として
jperl test.pl > test.txt
として下さい。
B.txt を置き換える場合は、
jperl test.pl
でよいです
    • good
    • 0
この回答へのお礼

丁寧な解答ありがとうございました。
とても助かりました。
また、よろしくお願いします。

お礼日時:2006/06/17 09:01

open(A, "A.txt");


open(B, "B.txt");

while(<B>){
$tmp = <A>;
chop $tmp;
s/A...A/$tmp/g;
print;
}

close(A);
close(B);

コマンドラインより

jperl test.pl > test.txt

これで test.txt に変換後のデータが書きこまれます。
こんな感じで期待通りの結果が得られるでしょうか?
    • good
    • 0
この回答へのお礼

親切な解答ありがとうございました。
また、よろしくお願いします。

お礼日時:2006/06/17 09:00

open(B, ">B.txt");


でOPENした時点でB.txtの内容は消えてしうので想定通りに動作しません。

あと、使用しない test.txtを指定しても意味がないです。
jperl test.pl > test.txt
単に jperl test.pl で動くと思います。


open(B1, "<B.txt");
@line_b = <B1>;
close(B1);

open(A, "<A.txt");
@line_a = <A>;
close(A);

open(B2, ">B.txt");
$i=0;
foreach (@line_b) {
if ($_ =~ /A(.+)A/) {
s/A(.+)A/$line_a[$i]/g;
$i++;
}
print B2;
}
close(B2);
    • good
    • 0
この回答へのお礼

早速の解答ありがとうございました。
また、よろしくお願いします。

お礼日時:2006/06/17 08:47

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


おすすめ情報