Perl says trick or treat. (the way to get "treat".) [Perl]

| コメント(0) | トラックバック(0)

たまには季節ものの話題でも。

$ perl -E 'say trick or treat'

$

...

何ももらえなかった(´・ω・`

気を取り直して..

$ perl -E 'say "trick" or "treat"'
trick
$

...

いたづらされますた

このままではお菓子はもらえない。一大事。どうしよう.

最初のはとりあえず置いておいて、2番目のやつ。
"trick" or "treat" が評価されて"trick"は真だから短絡評価されて"treat"は評価されずに結果として"trick"が式の値となってsay()に渡される。

わけではなく、

or operator の優先順位はとても低く、perl -MO=Deparse -E 'say "trick" or "treat"' してもわかる通り、先述の式は (say "trick") or "treat" と評価され、式の値はsayが成功すれば真値(1)、失敗すれば"treat"となる。ちなみに、use warningsを入れるとUseless use of a constant in void contextって言われる。

これは簡単には "treat" と言ってくれなさそう。

じゃぁ1個目のコードはどうか。 -MO=Deparse をつけて解析すると、

'???' unless say trick $_

と出てくる。何か勝手に$_とか付けられてます。trick$_を渡して呼び出した結果をsayしてる?否、sub trickはどこにも定義が無いのでtrick $_はサブルーチン呼び出しではない。

この文をよくよく見ると、IO::*モジュールが無かった(or 使われてなかった)頃のperlスクリプトによく出てきた文に似ている。

print OUT "hoge";

printの後に出てくるbarewordはfilehandleとみなされる。また、"say LIST" is simply an abbreviation for "{ local $\ = "\n"; print LIST }"であるので、say FH LIST{local $\ = "\n"; print FH LIST}のabbriviationということになろう。

結局、say trick とは、trickという名前が付けられたfilehandleへ"$_\n"をprintせよ。という意味になる。もちろんそんなfilehandleはopenされていないので、この関数呼び出しは失敗し、偽値を返す。

では、後半の or treat はどうなるかというと、今度のbareword "treat" は、filehandleではなく、unquoted stringとして扱われ、 orの左オペランドが偽である場合に評価される。

以上から、全体としてsay trick or treatの式の値は "treat"になることが判った。もうちょっとだけ変更を加えたらtreatと言ってもらそうだ。

というわけで、1番目のコードをちょっと変えて、

$ perl -E 'say(say trick or treat)'
treat
$

と、2回言えば無事にお菓子をもらうことができました。めでたしめでたし

# 2008-10-28 追記

2回言わすのがいやなら

$ echo '' | perl -pE '$_=(say trick or treat)'

って手もありますな。

トラックバック(0)

トラックバックURL: http://floralcompany.jp/mt/mt-tb.cgi/83

コメントする

AUTHOR

  • turugina (虎王 剱奈)
  • E-mail: turugina {at} floralcompany.jp
  • pixiv
  • ニジエ

2014年5月

        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

アーカイブ

OpenID対応しています OpenIDについて
Powered by Movable Type 5.2.10

- 警 告 -

本サイトにはいわゆる「18禁画像」(イラスト)へのリンクが存在します。 未成年の方や、その手の画像に不快感を覚える方は、 該当記事(「えちぃの」及び「ちょっとえちぃの」カテゴリ) をご覧にならないようお願いいたします。

上記を理解した上で非表示のブログパーツを表示する
あわせて読みたいブログパーツ
ついった
drawr/pixiv/twitpic