読者です 読者をやめる 読者になる 読者になる

稲沢市よりお届けしてます。

Perlをはじめとしたプログラミング周りのあれこれについて。Perl界のモブキャラとして暗躍します(謎)。

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






それにしても、なんだか同じような記述が続いて冗長なスクリプトだ。つなげたいファイルの数を増やしたときに、簡単に利用できるようにしたい。リファクタリングするとしたら、どうやってやろう??ファイル名を引数にしてサブルーチンにする感じ??




このあたりが自分の課題です。