Perl で複数のファイルを一気に開いて、Linuxコマンド【paste】みたいにつなげてみた
3つのファイルの1行目同士、2行目同士・・・n行目同士をつなげたい衝動に駆られました。
Linux環境では、
$ paste 1.txt 2.txt 3.txt > res.txt
みたいにすれば一発でしたが、Windows環境なのでそれもできず・・・。
で、Perl でやってみました。
まずは、つなげたい3つのファイルを準備。
1.txt (Shift_JISで保存)
↓
2.txt (Shift_JISで保存)
↓
3.txt (Shift_JISで保存)
↓
で、つなげるスクリプト。
paste.pl(UTF-8Nで保存)
↓
#!/usr/bin/perl # # Linuxコマンド【paste】っぽいことをする # # 2014.09.09_scripted by perl48 use strict; use warnings; use Encode; my $file1 = "1.txt"; open my $fh1, '<', $file1 or die qq{Can't open file "$file1": $!}; my $file2 = "2.txt"; open my $fh2, '<', $file2 or die qq{Can't open file "$file2": $!}; my $file3 = "3.txt"; open my $fh3, '<', $file3 or die qq{Can't open file "$file3": $!}; while(my $line1 = <$fh1>) { chomp $line1; $line1 = decode('cp932', $line1); my $line2 = <$fh2>; chomp $line2; $line2 = decode('cp932', $line2); my $line3 = <$fh3>; chomp $line3; $line3 = decode('cp932', $line3); my $res = $line1 . $line2 . $line3; $res = encode('cp932', $res); print $res . "\n"; } close $fh1; close $fh2; close $fh3;
思わぬ副産物でしたが、Perlで複数のファイルハンドルを一気に処理することできるんですね。知らんかった。
ここの質疑応答の回答2を参考にさせていただきましたー!
↓
http://okwave.jp/qa/q6529798.html
それにしても、なんだか同じような記述が続いて冗長なスクリプトだ。つなげたいファイルの数を増やしたときに、簡単に利用できるようにしたい。リファクタリングするとしたら、どうやってやろう??ファイル名を引数にしてサブルーチンにする感じ??
このあたりが自分の課題です。