ルモーリン
ホーム更新サービス雑談ランドナーコースガイド鉄ゲタ自転車Linuxリンク連絡先

比較演算子の使い分け

きっかけ

比較演算子を使い分けずに値を型変換(?)するようなツイートを見かけてこんなツイートをしました。

概要

比較演算子には大別して文字列比較と数値比較の2種類があります。 演算子が文字列と見るか数値と見るかの違いです。

コード

#!/usr/bin/env perl -w

use utf8;
use strict;
use warnings;

use Data::Dumper;
use Encode::Argv;
use Encode::Locale;

use open IO => ":utf8";

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

$| = 1;

my ($a, $b, $c, $d) = (1, "1.0", "a", "b");

print "$a < $b → " . ($a < $b ? "true" : "false") . "\n";
print "$a lt $b → " . ($a lt $b ? "true" : "false") . "\n";
print "$c < $d → " . ($c < $d ? "true" : "false") . "\n";
print "$c lt $d → " . ($c lt $d ? "true" : "false") . "\n";

exit;

実行結果

WindowsとCentOSで同じ結果になりました。 文字列で「1.0」を比較すると後ろの「.0」がある分、より大きな値の文字列となります。 数値では「a」と「b」は同じなので<は偽になります。
1 < 1.0 → false
1 lt 1.0 → true
Argument "b" isn't numeric in numeric lt (<) at sample_42.pl line 23.
Argument "a" isn't numeric in numeric lt (<) at sample_42.pl line 23.
a < b → false
a lt b → true