Perl でコードゴルフをする時に空白が必要なのはどういう場合か
普通にプログラミングをする上では、空白文字(スペース・タブ・改行)というものは多用されるが、文法上必須であるものは少ない。コードゴルフにおいては、最終的に出来上がるコードには、文法上必須であるような空白以外は不要である。Perl で空白が必要になるのは、空白が無いと1つのトークンとして解釈されてしまうような2つのトークンの区切りを示す場合である。
/[A-Z_a-z] [0-9A-Z_a-z]/
空白が必要なのは基本的には上記の正規表現にマッチするような場合である。print 1
, while s/hoge/fuga/
, for 1..100
などがこれに当てはまる。
print $a
, 0 for
, 0 while
, $% for
, for <>
などはこれには該当しないので空白は不要である。
0 x$a
これは丁寧に書くと '0'x$a
であり、文字列としての 0
を $a
回繰り返すことを意味する。0x$a
は、十六進数としての 0
の直後に $a
があると解釈されてしまう(エラーになる)ので、それを回避するために空白が必要。
123 .$a
これは丁寧に書くと '123'.$a
であり、文字列としての 123
と $a
を結合することを意味する。123.$a
は、実数としての 123
の直後に $a
があると解釈されてしまう(エラーになる)ので、それを回避するために空白が必要。
/hoge/ x
Perl では、/./g
, /a/i
のように、正規表現にオプションを付けることができる。正規表現の直後に or
, x
といった演算子を書きたい場合、o
や x
はオプションとして存在するので、空白が必要。
/hoge/for
や /hoge/while
は、f
や w
がオプションとして存在しないので、v5.16 までは空白が不要だったが、v5.18 からは空白が必要になった。/hoge/and
は、a
がオプションとして存在するのに何故か v5.16 までは使えていたが、v5.18 からは空白が必要になった。
perl v5.18.0 での変更点 > 英数字演算子は正規表現の閉じ区切り文字から分離されなければならなくなりました
$' for
$'
自体は特殊変数なのだが、直後に /[A-Z_a-z]/
があると、'
は無視される、つまり、$'hoge
は $hoge
と同じ意味になる、という謎の機能があるので、それを回避するために空白が必要。
この記事に対してコメントを貰ったので追記。
細かいことを言うと、 $'hoge は $main::hoge の意味で、 ' は無視されているわけではない。でも
— 齊藤 (tails) (@saito_ta) 2017年2月28日
・ :: は ' で代用できる
・ main パッケージは無名で表現してもいい
・ デフォルトで main パッケージにいる
ので、結果的に有っても無くても同じ。 https://t.co/K7gzu4NO0k