Perl-строки и операторы <&> - PullRequest
1 голос
/ 16 ноября 2011

Для сравнения строк обычно используется lt, gt и т. Д.

Что именно делает Perl, когда я сравниваю строки с помощью числовых операторов? (<,>)

my $str1 = 'Joe';
my $str2 = 'flight';

Я предполагаю, что при выполнении $str1 gt $str2 Perl сравнивает коды ASCII (?), Но что происходит, когда я делаю следующее:

$str1 > $str2

спасибо

Ответы [ 3 ]

4 голосов
/ 16 ноября 2011

Прежде всего, вы получили предупреждение:

Argument "flight" isn't numeric in numeric lt (<) at 
Argument "Joe" isn't numeric in numeric lt (<) at

Затем Perl преобразует эти строки в целые, чтобы они стали 0, тогда сравнение выполняется.

1 голос
/ 16 ноября 2011

Для Perl 10 - это 10 независимо от того, хранится ли она в виде строки (PV), целого числа со знаком (IV), целого числа без знака (UV) или числа с плавающей запятой (NV).

<, > и == сравнивают числовые значения их операндов.Тогда числовое значение вещи, которая не является числом, равно нулю *, поэтому числовое значение flight равно нулю (с предупреждением), а числовое значение Joe равно нулю (с предупреждением), поэтому они равны.

С другой стороны, числовое значение строки 10 равно 10, а числовое значение строки 2 равно 2, поэтому

10 >= 2       # True
'10' >= '2'   # True

10 ge 2       # False (ord('1') is less than ord('2'))
'10' ge '2'   # False

* - объекты могут быть переопределеныthis, а числовое значение ссылки является адресом ссылочного значения.

0 голосов
/ 16 ноября 2011
what exactly perl does when I compare strings using numerical operators? (<, >)

perl преобразует строки в числа перед их сравнением.

Обе строки в вашем примере конвертируются в ноль.

but what happens when I do the following:
$str1 > $str2

Они сравниваются в соответствии с "последовательностью сортировки"(номинально в алфавитном порядке), как если бы строки были отсортированы, как в телефонной книге.

'barney' < 'bammbam'

ложно:

compare 1st letters - tied
compare 2nd letters - tied
compare 3rd letters - "m" comes before "r", so the comparison is false.
...