ルモーリン

Perlサンプル27 真偽値を扱う

投稿:2020-10-19

Perlに文字列型や数値型の変数はなく、もちろん真偽値型の変数もありません。 スカラ型($v)、配列型(@v)、ハッシュ型(%v)はあります。 真偽値型はなく偽の真偽値があり定数はありません(ああ、ややこしい)。 プログラミング言語が異なれば言語仕様も異なるので仕方ありません。

true/falseもありません。 ない定数を使うと、それはもう定数ではないのでエラーになります。 プログラミング言語が異なれば言語仕様も異なるので仕方ありません。

#!/usr/bin/env perl

use v5.26;
use utf8;
use warnings;
use strict;

use Encode::Locale;

use feature "say";
use open IO => ":utf8";

binmode STDIN, ":encoding(console_out)";
binmode STDOUT, ":encoding(console_out)";

$| = 1;

if (true) {
	say "trueあり";
} else {
	say "trueなし";
}
Bareword "true" not allowed while "strict subs" in use at C:\data\PerlSample/perlsample_027_1.pl line 22.
Execution of C:\data\PerlSample/perlsample_027_1.pl aborted due to compilation errors.
 at C:\data\PerlSample/perlsample_027_1.pl line 22.

スカラ型に1か0を入れて代替するのもアリだと思います。 0の代わりに未定義値を使うのも手です。 Perlの場合、スカラ変数を初期化しないと未定義値に初期化されています。 未定義値の定数はなく関数undefの戻り値を使ってください。 引数不要でカッコも不要なので定数のように書けます。 プログラミング言語が異なれば言語仕様も異なるので仕方ありません。

#!/usr/bin/env perl

use v5.26;
use utf8;
use warnings;
use strict;

use Encode::Locale;

use feature "say";
use open IO => ":utf8";

binmode STDIN, ":encoding(console_out)";
binmode STDOUT, ":encoding(console_out)";

$| = 1;

my $takoluka_is_my_wife;

if ($takoluka_is_my_wife) {
	say "たこルカは俺の嫁";
} else {
	say "たこルカは俺の嫁でない";
}

$takoluka_is_my_wife = 1;

if ($takoluka_is_my_wife) {
	say "たこルカは俺の嫁";
} else {
	say "たこルカは俺の嫁でない";
}

$takoluka_is_my_wife = undef;

if ($takoluka_is_my_wife) {
	say "たこルカは俺の嫁";
} else {
	say "たこルカは俺の嫁でない";
}
たこルカは俺の嫁でない
たこルカは俺の嫁
たこルカは俺の嫁でない

世の中は広いのでtrue/falseを使いたい人も当然います。 そんな人向けにbooleanパッケージがあります。 プログラミング言語が異なれば言語仕様も異なるので仕方ありません。

#!/usr/bin/env perl

use v5.26;
use utf8;
use warnings;
use strict;

use boolean;
use Encode::Locale;

use feature "say";
use open IO => ":utf8";

binmode STDIN, ":encoding(console_out)";
binmode STDOUT, ":encoding(console_out)";

$| = 1;

if (true) {
	say "たこルカは俺の嫁";
} else {
	say "たこルカは俺の嫁でない";
}

if (false) {
	say "たこルカは俺の嫁";
} else {
	say "たこルカは俺の嫁でない";
}
たこルカは俺の嫁
たこルカは俺の嫁でない

真偽判定の結果はプログラミング言語毎に異なるので自分がよく知っているプログラミング言語と比べてみましょう。 プログラミング言語が異なれば言語仕様も異なるので仕方ありません。 警告は数値で比較する演算子が数値に出来なかった場合に表示されます。 例えば"1"なら良いのですけれど"abc"は数値にできません。 日頃から警告を1個も表示しないプログラミングを心がけておくと、1個表示されただけでバグと気付くのでとても便利です。 いつも10個表示させたまま放置しておくプログラミングでは11個目が表示されても気付かずにバグを放置します。

#!/usr/bin/env perl

use v5.26;
use utf8;
use warnings;
use strict;

use Encode::Locale;

use feature "say";
use open IO => ":utf8";

binmode STDIN, ":encoding(console_out)";
binmode STDOUT, ":encoding(console_out)";

$| = 1;

say q|たこルカは俺の嫁 0 == 0 | . (0 == 0 ? "" : "でない");
say q|たこルカは俺の嫁 0 == "0" | . (0 == "0" ? "" : "でない");
say q|たこルカは俺の嫁 0 == 1 | . (0 == 1 ? "" : "でない");
say q|たこルカは俺の嫁 0 == "1" | . (0 == "1" ? "" : "でない");
say q|たこルカは俺の嫁 0 eq 0 | . (0 eq 0 ? "" : "でない");
say q|たこルカは俺の嫁 0 eq "0" | . (0 eq "0" ? "" : "でない");
say q|たこルカは俺の嫁 0 eq 1 | . (0 eq 1 ? "" : "でない");
say q|たこルカは俺の嫁 0 eq "1" | . (0 eq "1" ? "" : "でない");
say q|たこルカは俺の嫁 1 == 0 | . (1 == 0 ? "" : "でない");
say q|たこルカは俺の嫁 1 == "0" | . (1 == "0" ? "" : "でない");
say q|たこルカは俺の嫁 1 == 1 | . (1 == 1 ? "" : "でない");
say q|たこルカは俺の嫁 1 == "1" | . (1 == "1" ? "" : "でない");
say q|たこルカは俺の嫁 1 eq 0 | . (1 eq 0 ? "" : "でない");
say q|たこルカは俺の嫁 1 eq "0" | . (1 eq "0" ? "" : "でない");
say q|たこルカは俺の嫁 1 eq 1 | . (1 eq 1 ? "" : "でない");
say q|たこルカは俺の嫁 1 eq "1" | . (1 eq "1" ? "" : "でない");
say q|たこルカは俺の嫁 "0" == 0 | . ("0" == 0 ? "" : "でない");
say q|たこルカは俺の嫁 "0" == "0" | . ("0" == "0" ? "" : "でない");
say q|たこルカは俺の嫁 "0" == 1 | . ("0" == 1 ? "" : "でない");
say q|たこルカは俺の嫁 "0" == "1" | . ("0" == "1" ? "" : "でない");
say q|たこルカは俺の嫁 "0" eq 0 | . ("0" eq 0 ? "" : "でない");
say q|たこルカは俺の嫁 "0" eq "0" | . ("0" eq "0" ? "" : "でない");
say q|たこルカは俺の嫁 "0" eq 1 | . ("0" eq 1 ? "" : "でない");
say q|たこルカは俺の嫁 "0" eq "1" | . ("0" eq "1" ? "" : "でない");
say q|たこルカは俺の嫁 "1" == 0 | . ("1" == 0 ? "" : "でない");
say q|たこルカは俺の嫁 "1" == "0" | . ("1" == "0" ? "" : "でない");
say q|たこルカは俺の嫁 "1" == 1 | . ("1" == 1 ? "" : "でない");
say q|たこルカは俺の嫁 "1" == "1" | . ("1" == "1" ? "" : "でない");
say q|たこルカは俺の嫁 "1" eq 0 | . ("1" eq 0 ? "" : "でない");
say q|たこルカは俺の嫁 "1" eq "0" | . ("1" eq "0" ? "" : "でない");
say q|たこルカは俺の嫁 "1" eq 1 | . ("1" eq 1 ? "" : "でない");
say q|たこルカは俺の嫁 "1" eq "1" | . ("1" eq "1" ? "" : "でない");
say q|たこルカは俺の嫁 0 == 0 | . (0 == 0 ? "" : "でない");
say q|たこルカは俺の嫁 0 == "0" | . (0 == "0" ? "" : "でない");
# say q|たこルカは俺の嫁 0 == abc | . (0 == abc ? "" : "でない");
say q|たこルカは俺の嫁 0 == "abc" | . (0 == "abc" ? "" : "でない");
say q|たこルカは俺の嫁 0 eq 0 | . (0 eq 0 ? "" : "でない");
say q|たこルカは俺の嫁 0 eq "0" | . (0 eq "0" ? "" : "でない");
# say q|たこルカは俺の嫁 0 eq abc | . (0 eq abc ? "" : "でない");
say q|たこルカは俺の嫁 0 eq "abc" | . (0 eq "abc" ? "" : "でない");
# say q|たこルカは俺の嫁 abc == 0 | . (abc == 0 ? "" : "でない");
# say q|たこルカは俺の嫁 abc == "0" | . (abc == "0" ? "" : "でない");
# say q|たこルカは俺の嫁 abc == abc | . (abc == abc ? "" : "でない");
# say q|たこルカは俺の嫁 abc == "abc" | . (abc == "abc" ? "" : "でない");
# say q|たこルカは俺の嫁 abc eq 0 | . (abc eq 0 ? "" : "でない");
# say q|たこルカは俺の嫁 abc eq "0" | . (abc eq "0" ? "" : "でない");
# say q|たこルカは俺の嫁 abc eq abc | . (abc eq abc ? "" : "でない");
# say q|たこルカは俺の嫁 abc eq "abc" | . (abc eq "abc" ? "" : "でない");
say q|たこルカは俺の嫁 "0" == 0 | . ("0" == 0 ? "" : "でない");
say q|たこルカは俺の嫁 "0" == "0" | . ("0" == "0" ? "" : "でない");
# say q|たこルカは俺の嫁 "0" == abc | . ("0" == abc ? "" : "でない");
say q|たこルカは俺の嫁 "0" == "abc" | . ("0" == "abc" ? "" : "でない");
say q|たこルカは俺の嫁 "0" eq 0 | . ("0" eq 0 ? "" : "でない");
say q|たこルカは俺の嫁 "0" eq "0" | . ("0" eq "0" ? "" : "でない");
# say q|たこルカは俺の嫁 "0" eq abc | . ("0" eq abc ? "" : "でない");
say q|たこルカは俺の嫁 "0" eq "abc" | . ("0" eq "abc" ? "" : "でない");
say q|たこルカは俺の嫁 "abc" == 0 | . ("abc" == 0 ? "" : "でない");
say q|たこルカは俺の嫁 "abc" == "0" | . ("abc" == "0" ? "" : "でない");
# say q|たこルカは俺の嫁 "abc" == abc | . ("abc" == abc ? "" : "でない");
say q|たこルカは俺の嫁 "abc" == "abc" | . ("abc" == "abc" ? "" : "でない");
say q|たこルカは俺の嫁 "abc" eq 0 | . ("abc" eq 0 ? "" : "でない");
say q|たこルカは俺の嫁 "abc" eq "0" | . ("abc" eq "0" ? "" : "でない");
# say q|たこルカは俺の嫁 "abc" eq abc | . ("abc" eq abc ? "" : "でない");
say q|たこルカは俺の嫁 "abc" eq "abc" | . ("abc" eq "abc" ? "" : "でない");
たこルカは俺の嫁 0 == 0 
たこルカは俺の嫁 0 == "0"
たこルカは俺の嫁 0 == 1 でない
たこルカは俺の嫁 0 == "1" でない
たこルカは俺の嫁 0 eq 0
たこルカは俺の嫁 0 eq "0"
たこルカは俺の嫁 0 eq 1 でない
たこルカは俺の嫁 0 eq "1" でない
たこルカは俺の嫁 1 == 0 でない
たこルカは俺の嫁 1 == "0" でない
たこルカは俺の嫁 1 == 1
たこルカは俺の嫁 1 == "1"
たこルカは俺の嫁 1 eq 0 でない
たこルカは俺の嫁 1 eq "0" でない
たこルカは俺の嫁 1 eq 1
たこルカは俺の嫁 1 eq "1"
たこルカは俺の嫁 "0" == 0
たこルカは俺の嫁 "0" == "0"
たこルカは俺の嫁 "0" == 1 でない
たこルカは俺の嫁 "0" == "1" でない
たこルカは俺の嫁 "0" eq 0
たこルカは俺の嫁 "0" eq "0"
たこルカは俺の嫁 "0" eq 1 でない
たこルカは俺の嫁 "0" eq "1" でない
たこルカは俺の嫁 "1" == 0 でない
たこルカは俺の嫁 "1" == "0" でない
たこルカは俺の嫁 "1" == 1
たこルカは俺の嫁 "1" == "1"
たこルカは俺の嫁 "1" eq 0 でない
たこルカは俺の嫁 "1" eq "0" でない
たこルカは俺の嫁 "1" eq 1
たこルカは俺の嫁 "1" eq "1"
たこルカは俺の嫁 0 == 0
たこルカは俺の嫁 0 == "0"
Argument "abc" isn't numeric in numeric eq (==) at C:\data\PerlSample/perlsample_027_4.pl line 53.
たこルカは俺の嫁 0 == "abc"
たこルカは俺の嫁 0 eq 0
たこルカは俺の嫁 0 eq "0"
たこルカは俺の嫁 0 eq "abc" でない
たこルカは俺の嫁 "0" == 0
たこルカは俺の嫁 "0" == "0"
Argument "abc" isn't numeric in numeric eq (==) at C:\data\PerlSample/perlsample_027_4.pl line 69.
たこルカは俺の嫁 "0" == "abc"
たこルカは俺の嫁 "0" eq 0
たこルカは俺の嫁 "0" eq "0"
たこルカは俺の嫁 "0" eq "abc" でない
Argument "abc" isn't numeric in numeric eq (==) at C:\data\PerlSample/perlsample_027_4.pl line 74.
たこルカは俺の嫁 "abc" == 0
Argument "abc" isn't numeric in numeric eq (==) at C:\data\PerlSample/perlsample_027_4.pl line 75.
たこルカは俺の嫁 "abc" == "0"
Argument "abc" isn't numeric in numeric eq (==) at C:\data\PerlSample/perlsample_027_4.pl line 77.
Argument "abc" isn't numeric in numeric eq (==) at C:\data\PerlSample/perlsample_027_4.pl line 77.
たこルカは俺の嫁 "abc" == "abc"
たこルカは俺の嫁 "abc" eq 0 でない
たこルカは俺の嫁 "abc" eq "0" でない
たこルカは俺の嫁 "abc" eq "abc"

条件式の所に値を1個だけ入れる書き方、この判定もプログラミング言語毎に異なります。 プログラミング言語が異なれば言語仕様も異なるので仕方ありません。 値の一つ「0E0」は数値リテラル(0×100)です。

#!/usr/bin/env perl

use v5.26;
use utf8;
use warnings;
use strict;

use Encode::Locale;

use feature "say";
use open IO => ":utf8";

binmode STDIN, ":encoding(console_out)";
binmode STDOUT, ":encoding(console_out)";

$| = 1;

say q|たこルカは俺の嫁 0 | . (0 ? "" : "でない");
say q|たこルカは俺の嫁 "0" | . ("0" ? "" : "でない");
say q|たこルカは俺の嫁 "" | . ("" ? "" : "でない");
my @array;
say qq|配列:'@array'|;
say q|たこルカは俺の嫁 @array | . (@array ? "" : "でない");
say q|たこルカは俺の嫁 undef | . (undef ? "" : "でない");
say q|たこルカは俺の嫁 0.0 | . (0.0 ? "" : "でない");
say q|たこルカは俺の嫁 "0.0" | . ("0.0" ? "" : "でない");
say q|たこルカは俺の嫁 0E0 | . (0E0 ? "" : "でない");
say q|たこルカは俺の嫁 "0E0" | . ("0E0" ? "" : "でない");
say q|たこルカは俺の嫁 " " | . (" " ? "" : "でない");
@array = qw/ たこルカ ルカ姐さん /;
say qq|配列:'@array'|;
say q|たこルカは俺の嫁 (@array) | . (@array ? "" : "でない");
shift @array;
say qq|配列:'@array'|;
say q|たこルカは俺の嫁 (@array) | . (@array ? "" : "でない");
shift @array;
say qq|配列:'@array'|;
say q|たこルカは俺の嫁 (@array) | . (@array ? "" : "でない");
たこルカは俺の嫁 0 でない
たこルカは俺の嫁 "0" でない
たこルカは俺の嫁 "" でない
配列:''
たこルカは俺の嫁 @array でない
たこルカは俺の嫁 undef でない
たこルカは俺の嫁 0.0 でない
たこルカは俺の嫁 "0.0"
たこルカは俺の嫁 0E0 でない
たこルカは俺の嫁 "0E0"
たこルカは俺の嫁 " "
配列:'たこルカ ルカ姐さん'
たこルカは俺の嫁 @array
配列:'ルカ姐さん'
たこルカは俺の嫁 @array
配列:''
たこルカは俺の嫁 @array でない