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)