@kyanny's blog

My life. Opinions are my own.

perl -l オプション

リモートホストで実行した Perl のワンライナーから print した内容が、ローカルホストで表示できる場合とできない場合がある - 刺身☆ブーメランのはてなダイアリーid:kdaiba さんのコメントにあった、 perl - オプション。なんとなく見覚えはあるけど何のためのオプションなのか知らなかったので、 perldoc perlrun を読み直してみた。でも英語なのでやっぱりよくわからなくて和訳をウェブで探して読んだ。

#

# -l[octnum]

自動の行末処理を行なうようにします。これには、2 つの独立した機能があります。 1 つには、-n や -p を使ったときに、自動的に$/(入力レコードセパレータ)を chomp します。 2 つめに octnum を $\(出力レコードセパレータ) に代入し、 print 文でセパレータを追加できるようにします。 octnum を指定しなかった場合には、その時点の $/ の値を $\ に設定します。たとえば、行を 80 カラムに切り詰めるには以下のようにします:

perl -lpe 'substr($_, 80) = ""'

$\ = $/ という代入は、-l スイッチが処理されるときに実行されるときに行なわれますので、-l スイッチの後に -0 スイッチを置くようにすれば、入力レコードセパレータを、出力レコードセパレータと違うようにもできます:

gnufind / -print0 | perl -ln0e 'print "found $_" if -p'

これはまず、$\ に改行 ($/ のデフォルト値) を設定し、それから $/ にヌル文字を設定します。

http://perldoc.jp/docs/perl/5.8.4/perlrun.pod

実際にやってみると:

[kyanny@kyanny-laptop2 ~]
$ perl -e 'print 1, 2, 3'
123[kyanny@kyanny-laptop2 ~]
$ perl -le 'print 1, 2, 3'
123
[kyanny@kyanny-laptop2 ~]
$
  • l オプションがついていると print した出力が改行される。
  • 0 オプションと組み合わせて使うと良いらしい。
$ perl -l0100e 'print 1, 2, 3'
123@[kyanny@kyanny-laptop2 ~]
  • 0 のうしろに八進数か十六進数を続けて書くと $/ を指定できる、らしい。
$ sudo dmesg | perl -le 'while (<>) { print; }'

とかやると、 -l ありとなしで改行のされ方が違うのがわかる。 while ループの中で print "\n"; をしないといけないようなワンライナーを書いたときに -l つけてるとそれが不要になると。少し便利かもしれない。