open関数でパイプを使う
- PerlでテキストファイルのRead/Writeを行うとき
open($fh, "< file_name.txt"); # read
...
open($fh, "> file_name.txt"); # write
...
のように書きますが、この表現はコマンドライン上でリダイレクトするのに似ていますよね。この直感通り、Perlのopen関数はパイプを使うことができます。
- 例えば、このパイプを利用して特別なModuleを使うことなく、gzip圧縮されたファイルのReadが可能になります。
List 1: パイプ使用例(gzipファイルのread)
コード
#!/usr/bin/perl -w
use strict;
{
my $fname = $ARGV[0];
my $fh;
if ($fname =~ /.gz$/) {
open($fh, "zcat $fname |"); # .... gzip
} else {
open($fh, "< $fname"); # ......... normal text
}
my @src = <$fh>;
close($fh);
print @src;
}
|
- List 1 のコードでは、ファイルの拡張子に応じて、適用するopen関数を使い分けています。
- 尚、zcatコマンドを使用せず、gzipコマンドでextractする場合は下記です。
open($fh, "gzip -dc $fname |");
- ファイルをgzip圧縮しつつwriteする場合は下記のように書けばOKです。-c は標準出力(stdout)への出力を指定する gzip コマンドのオプションです。
open($fh, "| gzip -c > $fname");
|