2019年5月16日木曜日

[Perl] 08. 実行方法

Perlスクリプトの実行方法に関するメモ。今更感がすごい。
(どうでもいい話だけど、ターミナルの先頭表現は > にした。見にくかったので...)



コマンドラインからの実行
コマンドラインから基本的なの実行方法は以下となる。

perl <ファイル名> 引数1, 引数2, ...
test.pl

use strict; use warnings; print "Hello World\n";
実行結果
> perl /test.pl
Hello World

ファイルの1行目に Perl のパスを書いておけば

./<ファイル名> 引数1, 引数2, ...

でも実行できるようになる。Perl のパスは which perl コマンドで調べることができる。
> which perl
/bin/perl
私の環境では Perl のパスは /bin/perl だったので、ファイルの1行目に #!/bin/perl と追記。
test.pl

#!/bin/perl use strict; use warnings; print "Hello World\n";
実行結果
> ./test.pl
Hello World

コマンドライン引数
受け取った引数は、特殊変数 @ARGV に格納される。foreach(@ARGV) として使用する場合が多いかな。個別に参照したい場合は $ARGV[0], $ARGV[1], ... とする。
他のスクリプトから実行された際の引数も同様。
test.pl

#!/bin/perl use strict; use warnings; foreach(@ARGV){ print $_."\n"; } print "\$ARGV[0] = $ARGV[0]"."\n"; print "\$ARGV[1] = $ARGV[1]"."\n";
実行結果
> ./test.pl 10 20
10
20
$ARGV[0] = 10
$ARGV[1] = 20

引数の数を知りたい場合は scalar 関数を使う。$#ARGV でも可だが、こちらは引数の数から -1 した値となるので注意。
test.pl

#!/bin/perl use strict; use warnings; if (scalar(@ARGV) == 0) { print "ERROR : No arguments\n"; exit; } print scalar(@ARGV)."\n"; print $#ARGV."\n";
実行結果
> ./test.pl
ERROR : No arguments
> ./test.pl 10 20
2
1

引数の数と shift 関数を使用して、配列 @ARGV をずらしながら(配列の先頭を削除しながら)順次取得する方法もある。オプション形式の引数を取得する場合はこちらの方が分かりやすいかも。
test.pl

#!/bin/perl use strict; use warnings; my $set_dir; my $set_file; my @others; while ($#ARGV >= 0) { if ($ARGV[0] eq "-d") { # set directory path $set_dir = $ARGV[1]; # -> 次の引数を代入 shift @ARGV; } elsif ($ARGV[0] eq "-f") { # set file name $set_file = $ARGV[1]; # -> 次の引数を代入 shift @ARGV; } else { # others push @others, $ARGV[0]; # -> 別の配列に追加 } shift @ARGV; } print "\$set_dir = $set_dir" ."\n"; print "\$set_file = $set_file"."\n"; print "\@others = @others" ."\n";
実行結果
> ./test.pl aaaa -d ./dir -f file.txt bbbb
$set_dir  = ./dir
$set_file = file.txt
@others   = aaaa bbbb

別のPerlスクリプトを実行
例として引数を総和を求めるスクリプトを用意する。
sum.pl

#!/bin/perl use strict; use warnings; # 引数の合計を返す sub sub_add { my $result; foreach (@_){ print $_."\n"; $result += $_; } return $result; } # サブルーチン sub_add を実行 my $sum = &sub_add(@ARGV); print "$sum"."\n";

スクリプトから上記の sum.pl スクリプトを実行するには system 関数を使う方法がある。
test.pl

#!/bin/perl use strict; use warnings; system("perl sum.pl 10 20 30");
実行結果
> ./test.pl
10
20
30
sum total = 60

また、バッククォート (`) を使う方法もある。こちらを使用した場合、実行先スクリプト内の print 文は表示されないが、その代わりに戻り値として取得することができる。不思議。
test.pl

#!/bin/perl use strict; use warnings; my @array = `perl sum.pl 10 20 30`; print "response : $_" foreach (@array);
実行結果
> ./test.pl
response : 10
response : 20
response : 30
response : sum total = 60

実行ファイル形式に変換
PAR::Packer 拡張モジュールをインストールすれば、以下のコマンドで Perl スクリプトを実行ファイル形式に変換できる。Perlをインストールしていないマシンでも実行できるようになるので便利。

pp -o <実行ファイル名> <スクリプト名>

test.pl を text.exe という実行ファイル形式に変換したい場合は以下のようになる。

> pp -o test.exe test.pl


0 件のコメント:

コメントを投稿