2009年08月09日 21:00 [Edit]

perl - にも真偽値は存在する

camel

実は、あるのです。

第135回 Perlに true, falseなんてない - bingo_nakanishiの他言語出身者のためのPerl入門
Perlにも true, falseなんてないのさ

真偽値 - Perl入門〜サンプルコードによるPerl入門〜
Perlにおける偽値
  1. 0
  2. "0"
  3. "" 空文字列
  4. undef
  5. () 空リスト
Perlにおける真値
  • 上記以外すべて
  • "0.0"は、数値としては0と等しいが、真として扱われる。

これも、厳密ではありません。

以下の条件が存在します。

  • 値がオブジェクトで、かつ演算子boolが定義されている場合、その結果

この事を利用して、Perlはブール演算の際には数値がゼロかどうかではなく、空文字列か否かでもなく、真偽値を要求していることが確認できます。

#!/usr/bin/perl
use strict;
use warnings;

package Scalar;
use Carp;
use overload 
    q(bool) => sub { carp q(bool); return !!${$_[0]} },
    q("")   => sub { carp q(""); return ${$_[0]} . "" },
    q(0+)   => sub { carp q(0+); return ${$_[0]} + 0  },
    fallback => 1;

sub new { 
    my $class = shift;
    my $val   = shift;
    bless \$val, $class;
}
1;

package main;
local $\ = "\n";

my $t = Scalar->new(1);
my $f = Scalar->new(0);
print 'true'  if $t;
print 'false' if $f;
print 'and' if $f && $t;
print 'or'  if $f || $t;
print $f + $t;
print $f . $t;

Perlには、真偽値専用のリテラルはありませんが、真偽コンテキストはあるわけです。

さらに別のいい方をすると、ブール演算に限らずPerlは値を「生で」使うことは決してなく、使われる値はその時のコンテキストに応じて、「その場で料理」されるということでもあります。むしろ0や空文字列を偽とみなすのは、「デフォルトの真偽値変換ルール」に過ぎないのです。

それが「Perlはコンテキスト指向言語である」の真意です。

Dan the Perl Monger


この記事へのトラックバックURL

この記事へのコメント
言及元の結論部分を引用しておきますね。

> ということで
>
> 真偽にあたる true, falseは、まああるけども、
> 予約語的な true, falseはないですよ。
> というお話でした。
Posted by Yuichirou at 2009年08月09日 22:08