active perlでファイル中に3行ほど数値列 例えば、12.344 23.233 33.45aaa 45.366 というような

数値が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";
}

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2008/04/27 11:20:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答5件)

id:yoshifumi1975 No.1

回答回数58ベストアンサー獲得回数10

ポイント20pt

Perlだと

@filename[$x] は、$filename[$x] になります。

@が付くものは、配列になります。

だから、 @all_line[$count]も、$all_line[$count] になります。

URLはダミーです。

http://d.hatena.ne.jp/yoshifumi1975/

id:youkan_ni_ocha

そういう記述はよくみるんですが、$all_line[$count]とすると、どうも、妙な動きになります。

@にもどすと、なおるんで@にしてあります。

さっき、気がついたのですが = ~ を =~とすると、正常動作しました。

どーも、これは仕様らしい。

2008/04/20 12:14:03
id:pahoo No.2

回答回数5960ベストアンサー獲得回数633

ポイント20pt

「妙な動き」が何が、具体的にお知らせください。

最初の for に入る前に、$count が 0 で初期化されていますか?

(URLはダミーです http://q.hatena.ne.jp/

id:youkan_ni_ocha

chomp関数を使うと、全くなにも表示されません。

chompをはずして =~s/aaa\n//g にすると、正常動作になります。

2008/04/20 12:16:39
id:yoshifumi1975 No.3

回答回数58ベストアンサー獲得回数10

ポイント20pt

chomp の使い方も間違ってますね。

chomp のリターン値は、切り取った文字ですので、改行が、$xx2に入ります。

$xx2 = chomp($xx);

$xx2 = ~s/aaa//g;

ではなくて、

chomp($xx);

$xx = ~s/aaa//g;

ですね。

use Data::Dumper;

して、

print Dumper 変数;

という感じで変数の中身を確認しながら書いたほうがいいかもしれませんね。

あと、perl -d でデバッグモードで実行できますんで、デバッグしながらやったほうがいいですよ。

http://www.ksknet.net/perl/datadumper.html

id:youkan_ni_ocha

なるほど、配列の@と$の謎以外は全てとけました。

chompそーやって使うとは、、、、、perlの解説HPどおりに記述したんですが、、、、

2008/04/20 12:19:49
id:b-wind No.4

回答回数3344ベストアンサー獲得回数440

ポイント20pt

配列の@と$の謎

とりあえずこの場合、$ の方が正解だ。

@ を使用した場合、スライスと言うモードで動作する。

提示されている場合だと、「たまたま」動いているだけに見える。

スライスの正しい使い方は、以下のリンク参照。

SBP:近藤嘉雪の「Perl News Letter」


今風に書くとこんな感じになるはずだが。

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";
}
id:cross99 No.5

回答回数4ベストアンサー獲得回数0

ポイント20pt

質問の本質ではありませんが、配列のループは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";
}


http://q.hatena.ne.jp/

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません