備忘録。単独記事に書くまでもない小ネタ。
Perl 5.10で追加された予約語(“say
”、“given ~ when
”、“state
”)などをワンライナーで使うときは“-e
”の代わりに“-E
”を使う。
$ perl -E 'say "Hello, World!"' Hello, World!
Perl 5.8だか5.10だかわからんときは、“-l
”オプションを付けておくとprint
がsay
に変身するので便利。
$ perl -le 'print "Hello, World!"' Hello, World!
スクリプトの一行目(shebang)にオプションを書いても良い。
#!/usr/bin/perl -l print "Hello, World!";
これは「$\ = $/;
」を本文に含むことと等価だ。そのため、「$/
」特殊変数をいじるオプション(“-0
”など)と共に利用するときは順番に注意しないといけない。
$ perl -e '$\ = $/; print "Hello, World!"' Hello, World!
スカラーコンテキストでsplit
すると、結果が@_
に入る。
#!/usr/bin/perl -l split //, "abcde"; print join " - ", @_; # 実行結果 # a - b - c - d - e
「$,
」特殊変数を使うと、print
、say
で出力するときにセパレータが入る。
$ perl -le '$, =", "; $_ = "a1b1c"; split "1"; print @_' a, b, c
ダブルクォート文字列の時は「$"
」特殊変数を使う。(上の例と結果は同じだ)
$ perl -le '$" =", "; $_ = "a1b1c"; split "1"; print "@_"' a, b, c
勿論ファイルに出力するときも効く。join
を使わずにCSVファイルが作れる。
#!/usr/bin/perl -l use IO::File; local $, = ","; my @row = qw! a b c !; my $fh = IO::File->new( "test.csv", "w" ); $fh->print( @row ); # 実行結果 # a,b,c
%INC
を参照すると、すでに読み込まれたモジュールへのパスが得られる。モジュールを読み込んでいるかどうかで処理を変えたい場合に使うと便利。
$ perl -MTime::HiRes -le 'print "$_ => $INC{ $_ }" for sort keys %INC' AutoLoader.pm => /opt/local/lib/perl5/5.10.1/AutoLoader.pm Config.pm => /opt/local/lib/perl5/5.10.1/darwin-2level/Config.pm Config_git.pl => /opt/local/lib/perl5/5.10.1/darwin-2level/Config_git.pl Config_heavy.pl => /opt/local/lib/perl5/5.10.1/darwin-2level/Config_heavy.pl DynaLoader.pm => /opt/local/lib/perl5/5.10.1/darwin-2level/DynaLoader.pm ~以下略~