数値が3行ならんでいる複数のファイルを連続して読み出して、
行末の改行コードを消したり、aaaを除去して画面上に表示させる。
(最終的にはひとつのファイルに保存する)というコードを書いていますが。
$xxに、chompとか置換コマンド(s)をかけようとすると、妙な動きしかしません。
どこが悪いのでしょう。$xxをそのまま表示させる分には正常に動作します。
# @filename[$x]は、ファイル名の配列です。
for ($x = 0; $x <= 15; $x++){
open(IN, @filename[$x]) or die "Can't open File!: @filename[$x]";
while ($xx = <IN>) {
$xx2 = chomp($xx);
$xx2 = ~s/aaa//g;
@all_line[$count] = $xx2;
$count++ ; }
close(IN) or die "Can't close File!: @filename[$x]";
}
}
for($x = 0; $x <= $count; $x++){
print @all_line[$x];
print "\n";
}
Perlだと
@filename[$x] は、$filename[$x] になります。
@が付くものは、配列になります。
だから、 @all_line[$count]も、$all_line[$count] になります。
URLはダミーです。
「妙な動き」が何が、具体的にお知らせください。
最初の for に入る前に、$count が 0 で初期化されていますか?
(URLはダミーです http://q.hatena.ne.jp/)
chomp関数を使うと、全くなにも表示されません。
chompをはずして =~s/aaa\n//g にすると、正常動作になります。
chomp の使い方も間違ってますね。
chomp のリターン値は、切り取った文字ですので、改行が、$xx2に入ります。
$xx2 = chomp($xx);
$xx2 = ~s/aaa//g;
ではなくて、
chomp($xx);
$xx = ~s/aaa//g;
ですね。
use Data::Dumper;
して、
print Dumper 変数;
という感じで変数の中身を確認しながら書いたほうがいいかもしれませんね。
あと、perl -d でデバッグモードで実行できますんで、デバッグしながらやったほうがいいですよ。
なるほど、配列の@と$の謎以外は全てとけました。
chompそーやって使うとは、、、、、perlの解説HPどおりに記述したんですが、、、、
配列の@と$の謎
とりあえずこの場合、$ の方が正解だ。
@ を使用した場合、スライスと言うモードで動作する。
提示されている場合だと、「たまたま」動いているだけに見える。
スライスの正しい使い方は、以下のリンク参照。
今風に書くとこんな感じになるはずだが。
my @all_line = (); foreach my $filename ( @filename ){ open( my $fh, $filename ) or die "Can't open File!: $filename"; while ( defined($xx = <$fh>) ) { chomp($xx); $xx =~ s/aaa//g; push @all_line, $xx; } close($fh) or die "Can't close File!: $filename"; } foreach my $line ( @all_line ) { print "$line\n"; }
質問の本質ではありませんが、配列のループはforeachで行うと$xや$countが不要となりコードが簡素になります
my @all_line; foreach my $file (@filename) { open my $IN , $file or die; push @all_line , <$IN>; close $IN; } foreach my $line (@all_line) { chomp $line; $line =~ s/aaa//; print $line."\n"; }
そういう記述はよくみるんですが、$all_line[$count]とすると、どうも、妙な動きになります。
@にもどすと、なおるんで@にしてあります。
さっき、気がついたのですが = ~ を =~とすると、正常動作しました。
どーも、これは仕様らしい。