Perl日記

PerlとかRubyとかPHPとかPythonとか

二つの変数を相互に入れる

・仕様

  • $aaa と $bbb という変数があり、中身はあるかもしれないし、ないかもしれない。
  • $aaa に値がないときには $bbb を $aaa に入れる。
  • $bbb に値がないときには $aaa を $bbb に入れる。
  • $aaa, $bbb ともに中身がない、というのは存在しない

こう考えた。

$aaa ||= $bbb ||= $aaa;

やってみた。

$aaa = 'test';
$bbb;

$aaa ||= $bbb ||= $aaa;

print "\$aaa -> $aaa\n";
print "\$bbb -> $bbb\n";
$aaa -> test
$bbb ->

だめだった。


B::Deparseを使ってみる。

$ perl -MO=Deparse
$aaa = 'test';
$bbb;

$aaa ||= $bbb ||= $aaa;
$aaa = 'test';
$bbb;
$aaa ||= ($bbb ||= $aaa);
- syntax OK

なるほど。
いつも「=」があると右から左に見るように慣れていたけれど、
ここでは先に左の「$aaa ||= 」が評価されている、ということか。


思いついたときは、おおこれスマートじゃね、と少し喜んだのだけれど。


結局以下のようにして対応した。

$aaa ||= $bbb;
$bbb ||= $aaa;

シンプルイズベスト。