つい昨日書いた内容ですが、ツイッターで補足をいただきましたのでここに書きます。
ありがとうございました。

ありがとうございました。

昨日は
と書くことで、ファイルハンドルに対する書き出しをコマンドにパイプラインで渡すことを研究しました。
たとえば、
と書けば__DATA__以降のデータから「Feb 12」を含むデータを、ソートして書き出すことが出来ます。
データの書き出しのファイルハンドルPIPEに書いたデータを、sortコマンドに渡すからです。
で、これのopen関数を3引数にすると、エラーになります。
これだと
と怒られます。
ところが、以下のように"|-"を使うと、3引数で書くことが出来ます。
さて、もう1つ昨日紹介しなかったんですが、入力のパイプも書けます。
2引数方式の場合は、パイプ(バー)をコマンドの後ろに書きます。
たとえばこうです。
3引数型は"-|"を使います。
-|と|-を組み合わせることもできます。
なかなか便利ですね。
open ファイルハンドル, "| コマンド"; # コマンドに出力
と書くことで、ファイルハンドルに対する書き出しをコマンドにパイプラインで渡すことを研究しました。
たとえば、
#! /usr/local/bin/perl
#
# pipeExample.pl -- パイプの使用例
use strict;
use warnings;
use utf8;
use 5.10.0;
open PIPE, "| sort";
while (<DATA>) {
print PIPE if /Feb 12/;
}
__DATA__
Jane Smith, Jan 06
Joe Black, Feb 12
Mike Millar, Feb 06
Jeff Hall, Feb 12
Elvis Wall, Feb 12
Cliford Hacknell, Feb 12
#
# pipeExample.pl -- パイプの使用例
use strict;
use warnings;
use utf8;
use 5.10.0;
open PIPE, "| sort";
while (<DATA>) {
print PIPE if /Feb 12/;
}
__DATA__
Jane Smith, Jan 06
Joe Black, Feb 12
Mike Millar, Feb 06
Jeff Hall, Feb 12
Elvis Wall, Feb 12
Cliford Hacknell, Feb 12
と書けば__DATA__以降のデータから「Feb 12」を含むデータを、ソートして書き出すことが出来ます。
データの書き出しのファイルハンドルPIPEに書いたデータを、sortコマンドに渡すからです。
で、これのopen関数を3引数にすると、エラーになります。
open PIPE, "|", sort"; # 間違い
これだと
Unknown open() mode '|' at ./pipeExample.pl line 10.
と怒られます。
ところが、以下のように"|-"を使うと、3引数で書くことが出来ます。
#! /usr/local/bin/perl
#
# pipeExample2.pl -- パイプの使用例2
use strict;
use warnings;
use utf8;
use 5.10.0;
open PIPE, "|-", "sort";
while (<DATA>) {
print PIPE if /Feb/;
}
__DATA__
Jane Smith, Jan 06
Joe Black, Feb 12
Mike Millar, Feb 06
Jeff Hall, Feb 12
Elvis Wall, Feb 12
Cliford Hacknell, Feb 12
#
# pipeExample2.pl -- パイプの使用例2
use strict;
use warnings;
use utf8;
use 5.10.0;
open PIPE, "|-", "sort";
while (<DATA>) {
print PIPE if /Feb/;
}
__DATA__
Jane Smith, Jan 06
Joe Black, Feb 12
Mike Millar, Feb 06
Jeff Hall, Feb 12
Elvis Wall, Feb 12
Cliford Hacknell, Feb 12
[sample]$ ./pipeExample2.pl
Cliford Hacknell, Feb 12
Elvis Wall, Feb 12
Jeff Hall, Feb 12
Joe Black, Feb 12
Mike Millar, Feb 06
Cliford Hacknell, Feb 12
Elvis Wall, Feb 12
Jeff Hall, Feb 12
Joe Black, Feb 12
Mike Millar, Feb 06
さて、もう1つ昨日紹介しなかったんですが、入力のパイプも書けます。
2引数方式の場合は、パイプ(バー)をコマンドの後ろに書きます。
open ファイルハンドル, "コマンド |"; # コマンドから入力
たとえばこうです。
#! /usr/local/bin/perl
#
# pipeExample3.pl -- パイプの使用例(入力、2引数)
use strict;
use warnings;
use utf8;
use 5.10.0;
open PIPE, "ls -al *.pl |";
while (<PIPE>) {
print if /Feb 12/;
}
close PIPE;
#
# pipeExample3.pl -- パイプの使用例(入力、2引数)
use strict;
use warnings;
use utf8;
use 5.10.0;
open PIPE, "ls -al *.pl |";
while (<PIPE>) {
print if /Feb 12/;
}
close PIPE;
[sample]$ ./pipeExample3.pl
-rwxr-xr-x@ 1 query1000 staff 196 Feb 12 20:11 packExample.pl
-rwxr-xr-x@ 1 query1000 staff 213 Feb 12 20:11 packExample2.pl
-rwxr-xr-x@ 1 query1000 staff 263 Feb 12 20:11 unpackExample.pl
-rwxr-xr-x@ 1 query1000 staff 196 Feb 12 20:11 packExample.pl
-rwxr-xr-x@ 1 query1000 staff 213 Feb 12 20:11 packExample2.pl
-rwxr-xr-x@ 1 query1000 staff 263 Feb 12 20:11 unpackExample.pl
3引数型は"-|"を使います。
#! /usr/local/bin/perl
#
# pipeExample4.pl -- パイプの使用例(入力、3引数)
use strict;
use warnings;
use utf8;
use 5.10.0;
open PIPE, "-|", "ls -al *.pl";
while (<PIPE>) {
print if /Feb 11/;
}
close PIPE;
#
# pipeExample4.pl -- パイプの使用例(入力、3引数)
use strict;
use warnings;
use utf8;
use 5.10.0;
open PIPE, "-|", "ls -al *.pl";
while (<PIPE>) {
print if /Feb 11/;
}
close PIPE;
[sample]$ ./pipeExample4.pl
-rwxr-xr-x@ 1 query1000 staff 423 Feb 11 23:08 backTick.pl
-rwxr-xr-x@ 1 query1000 staff 370 Feb 11 23:08 backTickW.pl
-rwxr-xr-x@ 1 query1000 staff 119 Feb 11 23:08 calPrint.pl
-rwxr-xr-x@ 1 query1000 staff 390 Feb 11 23:08 fileSearch.pl
-rwxr-xr-x@ 1 query1000 staff 423 Feb 11 23:08 backTick.pl
-rwxr-xr-x@ 1 query1000 staff 370 Feb 11 23:08 backTickW.pl
-rwxr-xr-x@ 1 query1000 staff 119 Feb 11 23:08 calPrint.pl
-rwxr-xr-x@ 1 query1000 staff 390 Feb 11 23:08 fileSearch.pl
-|と|-を組み合わせることもできます。
#! /usr/local/bin/perl
#
# pipeExample5.pl -- パイプの使用例(2月11日に作った*.plファイルを、サイズが小さい順に出力)
use strict;
use warnings;
use utf8;
use 5.10.0;
open INPIPE, "-|", "ls -al *.pl";
open OUTPIPE, "|-", "sort -nk5";
while (<INPIPE>) {
print OUTPIPE if /Feb 11/;
}
close INPIPE;
close OUTPIPE;
#
# pipeExample5.pl -- パイプの使用例(2月11日に作った*.plファイルを、サイズが小さい順に出力)
use strict;
use warnings;
use utf8;
use 5.10.0;
open INPIPE, "-|", "ls -al *.pl";
open OUTPIPE, "|-", "sort -nk5";
while (<INPIPE>) {
print OUTPIPE if /Feb 11/;
}
close INPIPE;
close OUTPIPE;
[sample]$ ./pipeExample6.pl
-rwxr-xr-x@ 1 query1000 staff 119 Feb 11 23:08 calPrint.pl
-rwxr-xr-x@ 1 query1000 staff 370 Feb 11 23:08 backTickW.pl
-rwxr-xr-x@ 1 query1000 staff 390 Feb 11 23:08 fileSearch.pl
-rwxr-xr-x@ 1 query1000 staff 423 Feb 11 23:08 backTick.pl
-rwxr-xr-x@ 1 query1000 staff 119 Feb 11 23:08 calPrint.pl
-rwxr-xr-x@ 1 query1000 staff 370 Feb 11 23:08 backTickW.pl
-rwxr-xr-x@ 1 query1000 staff 390 Feb 11 23:08 fileSearch.pl
-rwxr-xr-x@ 1 query1000 staff 423 Feb 11 23:08 backTick.pl
なかなか便利ですね。