シェルでスクリプトやワンライナーの中にパイプでperlスクリプトを入れこむときに引数と標準入力を両方使いたい
(230825追記しました, Perl v5.26.2/v5.36.0)
scriptの場合
その1
@ARGV
で引数を受け取って、<STDIN>
演算子をつかう。
perlスクリプトで最初のほうに
my(@hikisu) = @ARGV ;
1行入れておけばいいだけ。
以前は、
my(@hikisu) = @ARGV ;
@ARGV = ('-');
として、引数を受け取ったあとに標準入力に入れ替えて<>をつかっていた。でもつかったほうが明示的でよい。
例えば、test.pl
として以下
#!/usr/bin/perl -w #適当にshebang
my(@hikisu) = @ARGV ; #最初に引数を格納しておく
print "0: $hikisu[0]\n" ;
print "1: $hikisu[1]\n" ;
print "2: $hikisu[2]\n" ;
while (<STDIN>) {
my($line) = $_ ;
print $line ;
}
以前のはこちら
#!/usr/bin/perl -w
my(@hikisu) = @ARGV ;
@ARGV = ('-'); #引数を受け取ったあとに標準入力に入れ替えている
print "0: $hikisu[0]\n" ;
print "1: $hikisu[1]\n" ;
print "2: $hikisu[2]\n" ;
#ここで<>を使用
while (<>) {
my($line) = $_ ;
print $line ;
}
と作成して、シェルで実行すると
$ echo "test" | perl -w test.pl 0 1 2
0: 0
1: 1
2: 2
test
こうなる。あとは標準出力からまたパイプで続けていけばよい。
その2
もしくは-s
を使ってもよさそう
$ perl -help
...
...
-s enable rudimentary parsing for switches after programfile
...
...
#!/usr/bin/perl -s
our($testVar);
while(<>){s/$testVar/___/;print;}
こんな感じで実行する
$ TESTVAR=sss | echo "aaa\nbbb\nsss\nccc\n" | perl -w test2.pl -testVar=$TESTVAR
aaa
bbb
___
ccc
$
参照:https://stackoverflow.com/questions/507387/how-can-i-parse-command-line-switches-in-perl How can I parse command-line switches in Perl?
one-linerの場合
-s
を使うとできた。
引数をうしろに-var=...
などで指定できる。
one linerで使う時は、まず--
でsh側の変数解析をキャンセルしておかないとだいたい変なことになる。
以下のように使う。
$ TESTVAR=sss | echo "aaa\nbbb\nsss\nccc\n" | perl -spe 's/$testVar/___/;' -- -testVar=$TESTVAR
aaa
bbb
___
ccc
$
参照:https://qiita.com/joemphilips/items/45060735942a36140ad9 [小ネタ]perlワンライナーにシェル変数を渡す
参照:https://qiita.com/ymko/items/9c7dd37a7b41d1e21e84 引数"--"(Double dash)のみとは何を意味するのか