LoginSignup
0
0

perlスクリプトをシェルスクリプトやワンライナーの中にパイプで入れこむときに引数と標準入力を両方使いたい

Last updated at Posted at 2020-01-28

シェルでスクリプトやワンライナーの中にパイプでperlスクリプトを入れこむときに引数と標準入力を両方使いたい

(230825追記しました, Perl v5.26.2/v5.36.0)

scriptの場合

その1

@ARGVで引数を受け取って、<STDIN>演算子をつかう。

perlスクリプトで最初のほうに

my(@hikisu) = @ARGV ;

1行入れておけばいいだけ。

以前は、

my(@hikisu) = @ARGV ;
@ARGV = ('-');

として、引数を受け取ったあとに標準入力に入れ替えて<>をつかっていた。でもつかったほうが明示的でよい。

例えば、test.plとして以下

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 ;
}

以前のはこちら

test.pl
#!/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
...
...
test2.pl
#!/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)のみとは何を意味するのか

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0