- ベストアンサー
特定の数字を抜いて行をずらす方法
- 特定の数字を抜いて、行をずらす方法についてお伺いします。
- 質問文章の最初の行のひとつの数字を抜いて、行をずらしたいのですが、うまくいきません。
- 分割してから、特定の数字を抜いて行をずらす方法についてアドバイスをいただきたいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
表示がくずれるので、空白2文字を全角空白にしていることに注意。 use strict; use warnings; use constant CUT_INDEX => 3; my @data = (); while ( my $line = <DATA> ) { $line =~ s/\x0D?\x0A?$//; push @data, [ split ' ', $line ]; } print_data(@data); # 0 1 2 3 4 # 9 8 7 6 5 # 6 5 4 3 2 # 7 8 6 9 2 # 8 0 9 8 1 my $line_len = scalar @data; for ( my $i = 0; $i < $line_len; $i++ ) { if ( $i < ( $line_len - 1 ) ) { $data[$i]->[CUT_INDEX] = $data[ $i + 1 ]->[CUT_INDEX]; } else { splice @{ $data[$i] }, CUT_INDEX; } } print "\n"; print_data(@data); # 0 1 2 6 4 # 9 8 7 3 5 # 6 5 4 9 2 # 7 8 6 8 2 # 8 0 9 sub print_data { my @data = (@_); my $line_len = scalar @data; for ( my $i = 0; $i < $line_len; $i++ ) { my $row_len = scalar @{ $data[$i] }; for ( my $j = 0; $j < $row_len; $j++ ) { print $data[$i]->[$j], ' '; } print "\n"; } } __DATA__ 0 1 2 3 4 9 8 7 6 5 6 5 4 3 2 7 8 6 9 2 8 0 9 8 1
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
そもそも「抜いた」3 の代わりにその次の行からデータをもらっているんだから, 単純に 「ある行を読み込み, なんか処理をして出力する」 だけではできっこないよね. 1行ごとに処理するなら 「1行目と 2行目を読み込んで 1行目を出力, 3行目を読み込んで 2行目を出力, ...」 という形になるし, (メモリが十分にあれば) 「全部読み込んでなんかしてから全部書き込む」 方が簡単になるかもしれん. ところで, 最後の行の最後にある「1」はどこへ消えたの? ああ, split は /\s+/ と ' ' のどっちがいいんだろう....
お礼
回答ありがとうございました。助かりました。