Perl has distinct operators ==
and eq
for numerical and lexical comparisons respectively. An asterisk "*" indicates that a comparison raises a warning.
Note: unlike PHP and JavaScript, Perl does not have a true
boolean, only false. When a comparison succeeds, 1
is returned. Also, false is not directly accessible.
Perl lacks the ===
"strict equality" operator.
my $false = (0 == 1); my @arr0 = (); my %hash0 = (); my @arr1 = ('perl'); my %hash1 = ('perl' => 'equality');
Note that the literal expression ()
behaves differently in equality comparisons from either @arr0
or %hash0
. Similarly ('perl')
behaves differently from @arr1
and ('perl' => 'equality')
behaves differently from %hash1
.
== | undef | () | '' | $false | 'perl' | 0 | '0' | (0) | ('0') | @arr0 | %hash0 | 1 | '1' | (1) | ('1') | @arr1 | %hash1 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
undef | true** | true** | true** | true* | true** | true* | true* | true* | true* | true* | true* | false* | false* | false* | false* | false* | false** |
() | true** | true** | true** | true* | true** | true* | true* | true* | true* | true* | true* | false* | false* | false* | false* | false* | false** |
'' | true** | true** | true** | true* | true** | true* | true* | true* | true* | true* | true* | false* | false* | false* | false* | false* | false** |
$false | true* | true* | true* | true | true* | true | true | true | true | true | true | false | false | false | false | false | false* |
'perl' | true** | true** | true** | true* | true** | true* | true* | true* | true* | true* | true* | false* | false* | false* | false* | false* | false** |
0 | true* | true* | true* | true | true* | true | true | true | true | true | true | false | false | false | false | false | false* |
'0' | true* | true* | true* | true | true* | true | true | true | true | true | true | false | false | false | false | false | false* |
(0) | true* | true* | true* | true | true* | true | true | true | true | true | true | false | false | false | false | false | false* |
('0') | true* | true* | true* | true | true* | true | true | true | true | true | true | false | false | false | false | false | false* |
@arr0 | true* | true* | true* | true | true* | true | true | true | true | true | true | false | false | false | false | false | false* |
%hash0 | true* | true* | true* | true | true* | true | true | true | true | true | true | false | false | false | false | false | false* |
1 | false* | false* | false* | false | false* | false | false | false | false | false | false | true | true | true | true | true | true* |
'1' | false* | false* | false* | false | false* | false | false | false | false | false | false | true | true | true | true | true | true* |
(1) | false* | false* | false* | false | false* | false | false | false | false | false | false | true | true | true | true | true | true* |
('1') | false* | false* | false* | false | false* | false | false | false | false | false | false | true | true | true | true | true | true* |
@arr1 | false* | false* | false* | false | false* | false | false | false | false | false | false | true | true | true | true | true | true* |
%hash1 | false** | false** | false** | false* | false** | false* | false* | false* | false* | false* | false* | true* | true* | true* | true* | true* | true** |
eq | undef | () | '' | $false | 'perl' | 0 | '0' | (0) | ('0') | @arr0 | %hash0 | 1 | '1' | (1) | ('1') | @arr1 | %hash1 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
undef | true** | true** | true* | true* | false* | false* | false* | false* | false* | false* | false* | false* | false* | false* | false* | false* | false* |
() | true** | true** | true* | true* | false* | false* | false* | false* | false* | false* | false* | false* | false* | false* | false* | false* | false* |
'' | true* | true* | true | true | false | false | false | false | false | false | false | false | false | false | false | false | false |
$false | true* | true* | true | true | false | false | false | false | false | false | false | false | false | false | false | false | false |
'perl' | false* | false* | false | false | true | false | false | false | false | false | false | false | false | false | false | false | false |
0 | false* | false* | false | false | false | true | true | true | true | true | true | false | false | false | false | false | false |
'0' | false* | false* | false | false | false | true | true | true | true | true | true | false | false | false | false | false | false |
(0) | false* | false* | false | false | false | true | true | true | true | true | true | false | false | false | false | false | false |
('0') | false* | false* | false | false | false | true | true | true | true | true | true | false | false | false | false | false | false |
@arr0 | false* | false* | false | false | false | true | true | true | true | true | true | false | false | false | false | false | false |
%hash0 | false* | false* | false | false | false | true | true | true | true | true | true | false | false | false | false | false | false |
1 | false* | false* | false | false | false | false | false | false | false | false | false | true | true | true | true | true | false |
'1' | false* | false* | false | false | false | false | false | false | false | false | false | true | true | true | true | true | false |
(1) | false* | false* | false | false | false | false | false | false | false | false | false | true | true | true | true | true | false |
('1') | false* | false* | false | false | false | false | false | false | false | false | false | true | true | true | true | true | false |
@arr1 | false* | false* | false | false | false | false | false | false | false | false | false | true | true | true | true | true | false |
%hash1 | false* | false* | false | false | false | false | false | false | false | false | false | false | false | false | false | false | true |
local $SIG{'__WARN__'} = sub { my $warning = shift; # etc. };
When Perl needs to interpret an expression as a scalar, such as for binary comparisons, arithmetic or string operations, it follows these rules:
(0)
, ('0')
, (1)
or ('1')
, the last expression in the list is used.()
, "the last expression in the list" is considered to be undef
.@arr0
or @arr1
, the length of the array is used.%hash0
or %hash1
, a string such as '1/8'
indicating the number of filled buckets in the hash is used.If number is required, as for both sides of ==
, Perl follows these rules:
'0'
and '1'
become 0
and 1
respectively. '1/8'
becomes 1
, with one warning. 'perl'
and ''
become 0
, with one warning.[]
might become 3309920
.$false
, becomes 0
.undef
becomes 0
, with one warning.If a string is required, as for both sides of eq
, Perl follows these rules:
0
and 1
become '0'
and '1'
respectively. Positive infinity becomes '1.#INF'
, negative infinity becomes '-1.#INF'
, NaN becomes '-1.#IND'
.[]
might become 'ARRAY(0x87b1d8)'
.$false
, becomes the empty string ''
.undef
becomes the empty string ''
, with one warning.==
and eq
are transitive.Expressions I am considering adding include ('perl')
, ('perl' => 'equality')
, []
, {}
, 1/8
and '1/8'
(note that %hash1 eq '1/8'
, at least on my machine). It depends how useful this information would be.
Discussion (36)
2014-09-07 04:31:04 by chridd:
2014-09-07 05:23:05 by Rangi:
2014-09-07 06:37:51 by David Mitchell:
2014-09-07 11:05:55 by Andrew:
2014-09-07 11:08:29 by Andrew:
2014-09-07 11:41:37 by qntm:
2014-09-07 11:46:28 by Andrew:
2014-09-07 18:17:17 by chridd:
2014-09-07 18:21:50 by qntm:
2014-09-08 06:02:55 by Coda:
2014-09-08 07:55:19 by FKK:
2014-09-08 10:20:04 by qntm:
2014-09-08 12:54:04 by Veky:
2014-09-08 13:23:47 by qntm:
2014-09-08 16:51:36 by Moses:
2014-09-08 17:24:45 by qntm:
2014-09-08 19:30:10 by davidgro:
2014-09-08 20:43:52 by Veky:
2014-09-09 01:38:01 by MichaelSzegedy:
2014-09-09 06:32:32 by chridd:
2014-09-09 06:35:59 by chridd:
2014-09-12 14:13:07 by MichaelSzegedy:
2014-09-14 16:54:18 by Tassos Bassoukos:
2014-09-14 17:42:49 by qntm:
2014-09-15 04:46:40 by Joel Berger:
2014-09-15 08:35:08 by qntm:
2014-09-15 09:43:57 by Xaerxess:
2014-09-15 11:59:42 by qntm:
2014-09-15 12:59:55 by Joel Berger:
2014-09-15 13:32:03 by qntm:
2014-09-16 01:14:07 by Joel Berger:
2014-09-17 03:54:57 by OvermindDL1:
2014-09-17 06:16:01 by chridd:
2014-09-17 18:07:08 by OvermindDL1:
2015-07-17 01:15:21 by Sean:
2015-10-14 03:29:19 by chridd: