人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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";
}

●質問者: youkan_ni_ocha
●カテゴリ:コンピュータ 学習・教育
✍キーワード:23 AAA Active open Perl
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● yoshifumi1975
●20ポイント

Perlだと

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

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

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

URLはダミーです。

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

◎質問者からの返答

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

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

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

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


2 ● pahoo
●20ポイント

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

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

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

◎質問者からの返答

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

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


3 ● yoshifumi1975
●20ポイント

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

◎質問者からの返答

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

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


4 ● b-wind
●20ポイント

配列の@と$の謎

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

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

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

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

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";
}

5 ● cross99
●20ポイント

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ