Perl Tips: openとパイプ
2018/08/19
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");
Copyright(C) 2018 Altmo
本HPについて