Perl - ワンライナー

Perlワンライナーを書くとき、$ とかをシェルに解釈されないようにシングルクオートで囲む方がいい。

% perl -e 'print $ENV{SHELL}'
/usr/local/bin/zsh

シングルクオート自身を使いたいときは変数に格納して使うと楽。

% perl -e '$quote = "\x27"; print $quote, $ENV{SHELL}, $quote'
'/usr/local/bin/zsh'

引数をとるワンライナーを作るときの注意として、マイナスから始まる引数は Perl が吸収してしまうので -- を書いて吸収させないようにする。

% perl -MGetopt::Long -e 'GetOptions("v" => \$v); print "0.01" if $v' -v
This is perl 5, version 16, ... # perl に -v が吸収されちゃう

% perl -MGetopt::Long -e 'GetOptions("v" => \$v); print "0.01" if $v' -- -v
0.01

ワンライナーを alias に登録するときは、シングルクオートの使い方に注意して登録。cf: wikipedia

alias hello='perl -e '\''print "hello"'\'''
alias with-args='perl -MGetopt::Long -e '\''GetOptions("v" => \$v); print "0.01" if $v'\'' --'

alias pwdh='perl -MCwd -MSys::Hostname -le '\''print hostname, ":", Cwd::realpath(shift || ".")'\'''
alias ports='perl -e '\''$l=1 if @ARGV && $ARGV[0] =~ /-l/; for(`sudo lsof -i -n -P 2>/dev/null`){next if $l && !/LISTEN/i; s{(?<=:)(\d+)(?=[\s-])}{"\e[1;31m".$1."\e[m"}ge; print}'\'' --'
% pwdh .zshrc # hostname をつけてpwd。scp するときに楽。
MBA2011.local:/Users/skaji/.zshrc

% ports | head # ポート一覧
COMMAND     PID           USER   FD   TYPE             DEVICE SIZE/OFF   NODE NAME
launchd       1           root   19u  IPv4 0x32659d770b1c01ab      0t0    UDP *:137
launchd       1           root   20u  IPv4 0x32659d770b1c0023      0t0    UDP *:138
launchd       1           root   27u  IPv6 0x32659d770b5c60d3      0t0    TCP [::1]:631 (LISTEN)

% ports -l # listen しているポート一覧
launchd       1           root   27u  IPv6 0x32659d770b5c60d3      0t0    TCP [::1]:631 (LISTEN)
launchd       1           root   28u  IPv4 0x32659d770b5cb0bb      0t0    TCP 127.0.0.1:631 (LISTEN)
Dropbox   61701          skaji   26u  IPv4 0x32659d770b5c856b      0t0    TCP *:17500 (LISTEN)
Dropbox   61701          skaji   33u  IPv4 0x32659d770e2a70bb      0t0    TCP 127.0.0.1:26164 (LISTEN)