Perl provides two sets of comparison operators; : one set for working with numbers , and one set for working with strings.
...
Do not use the number comparison operators on non-numeric nonnumeric strings. Likewise, do not use the string comparison operators on numbers.
Noncompliant Code Example (
...
Numbers)
This noncompliant code example improperly uses eq
to test two numbers for equality. Counterintuitively, this code prints false.
...
The counterintuitive result arises from the fact that because $num
is interpreted as a number. When it is initialized, the 02
string is converted to its numeric representation, which is 2
. When it is compared, it is convered converted back to a string, but this time it has the value 2
, and so the string comparison fails.
Compliant Solution (
...
Numbers)
This compliant colution solution uses ==
, which interprets its arguments as numbers. Thus this This code therefore prints true
, even though the right argument to ==
is explicitly provided as a string.
Code Block | ||||
---|---|---|---|---|
| ||||
my $num = 02; # ... if ($num == "02") {print "true\n"} else {print "false\n"}; |
Noncompliant Code Example (
...
Strings)
This noncompliant code example improperly uses ==
to test two strings for equality.
...
The ==
operator first converts its arguments into numbers . This is done by extracting digits from the front of each arguments argument (along with a preceding +
or -
). Non-numeric Nonnumeric data in an argument is ignored, and the number consists of whatever digits were extract. A string such as "goodpass"
has no leading digits , and is thus converted to the numeral 0. Consequently, unless either $password
or $correct
contains leading digits, they will both be converted to 0 , and will therefore be considered equivalent.
Compliant Solution (
...
Strings)
This compliant colution solution uses eq
, which interprets its arguments as strings.
...