2007年12月07日 19:00 [Edit]

perl - 勝手に添削 - SvTRUEをPurePerlで

ちょっと風邪気味なので今日は家でおとなしく。

SvTRUE、PurePerl版 - D-6 [相変わらず根無し]
sub SvTRUE{
    my $x = shift;
    if (! defined $x) {
        return ();
    }
    if (!ref $x && $x =~ /\D/) {
        return length($x) > 1 || substr($x, 0, 1) ne '0';
    } else {
        return $x;
    }
}

長過ぎるように見えるのは体調のせいじゃないよね。


だって、一行でこう書けるんだもん。

sub SvTRUE{ !! $_[0] }

で、以下証拠。

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

sub SvTRUE{ !! $_[0] }

{
    package Hoge;
    use overload bool => \&hoge_bool, '""' => \&hoge_string, fallback => 1;
    sub new { bless { val => $_[1] }, $_[0] }
    sub hoge_bool { !shift->{val} }   # opposite
    sub hoge_string { "Hoge(val=$_[0]->{val})" }
}

my @list = ( 0, 1, "0E0", "0", '', {}, undef, Hoge->new(0), Hoge->new(1) );
foreach my $v (@list) {
    print defined $v ? $v : 'undef', " is ", SvTRUE($v) ? "true" : "false",
      "\n";
}
% perl svtrue.pl
0 is false
1 is true
0E0 is true
0 is false
 is false
HASH(0x1804df0) is true
undef is false
Hoge(val=0) is true
Hoge(val=1) is false

Perl以外でも炭坑、じゃなかった単項(unary)の!を持っているLLならこれでOKのはず。例えばJavaScriptの例が以下に。

Benchmarkは取ってないけど、こっちの方が見た目も速そう。

Dan the !!Postive Perl Monger


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