アプリ版:「スタンプのみでお礼する」機能のリリースについて

プログラム初心者です。

Perlで下記のような文字列処理のプログラムの書き方がわからず、質問させて頂きました。

【内容】
FILE_A.txtが「!」マークで区切られていて、「!」マークの下行の文字列をIPアドレスの右横に移動したものをFILE_B.txtに出力するという処理です。

「!」マークの下行の文字列の「name」は共通です。

--------------------------------------------
【FILE_A.txt】
!
name abcdeLV
123.123.123.123
123.123.123.124
123.123.123.125
!
name fghijLV
10.10.10.11
10.10.10.12
10.10.10.13 10.10.10.15
10.10.10.16
!
--------------------------------------------



--------------------------------------------
【FILE_B.txt】
123.123.123.123 abcdeLV
123.123.123.124 abcdeLV
123.123.123.125 abcdeLV
10.10.10.11 fghijLV
10.10.10.12 fghijLV
10.10.10.13 10.10.10.15 fghijLV
10.10.10.16 fghijLV
--------------------------------------------


上記のようなPerlでの処理を具体的に教えて頂ければうれしいです。

本サイトのようなものを利用するのが初めてですので、不手際があるかもしれませんが
なにとぞよろしくお願いいたします。

A 回答 (2件)

入力ファイルの構造に乱れがなければ、次のプログラムで処理できると思います。



use strict;
open IN, "FILE_A.txt" or die "Can't open FILE_A.txt: $!";
open OUT, ">FILE_B.txt" or die "Can't open FILE_B.txt: $!";
my $name;

while (my $line = <IN>) {
if (substr($line, 0, 1) eq '!') {
$name = '';
} elsif ($name eq '') {
$name = (split /\s+/, $line)[1];
} else {
$line =~ s/$/ $name/;
print OUT $line;
}
}

close IN; close OUT;
    • good
    • 0
この回答へのお礼

この度はご回答ありがとうございます。
早期にご回答頂き、またこちらが意図していたファイルの入出力まで
書いて頂いておりましたので、ベストアンサーにさせて頂きました。

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

お礼日時:2011/08/12 19:04

書いてある条件を素直に読めば



use strict;

my $name;

while (<>) {
chomp;
if (/^!/) {
last unless defined ($_ = <>);
chomp;
/^name\s+(\S+)/ or die;
$name = $1;
} else {
print "$_ $name\n";
}
}

くらい? あ, chomp は癖で書いてるだけです.
    • good
    • 0
この回答へのお礼

この度はご回答頂きましてありがとうございます。

Tacosan様が書いて頂いた方法でも、今回の処理ができるということで
勉強になりました。

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

お礼日時:2011/08/12 19:07

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