Причина отвратившая меня от преодоления дальнейших затруднений при изучении Perl возникла при самом первом знакомстве: недоумение от непоследовательного, на мой взгляд, истолкования истинности строк ('' и '0' — «ложь», остальные — «истина»).
С одной стороны было бы понятно, если бы любая непустая строка истолковывалась как истинная (как в AWK, JavaScript, Python, PowerShell…), с другой, — если бы как ложная истолковывалась любая строка с числовым значением 0: '00', '0.0'… (как, например, в AutoHotkey).
Почему же сделано так, как сделано? Я сомневаюсь, что из соображения простоты исполнения, — скорее проще было бы воплотить один из двух указанных мной подходов. Или, может быть, есть какие-то прикладные ненадуманные случаи, в которых оправдан именно такой выбор? (Хотя, если говорить о реализации истинностных значений, тоже не совсем понятно: почему «истина» — число 1 (хотя как проверить, что это именно число, а не строка, — как в Perl узнать тип скалярного значения?), а «ложь» — строка ''?)
(Да, я знаю, что подобным же образом дело обстоит в PHP, но: в нём это сделано под влиянием Perl; PHP — средство, которое выбирают не по любви, а по необходимости; уровень вхождения в PHP ниже.)
Понимаю, что такой вопрос прежде всего следовало бы задать создателю языка, но, думаю, я не первый, у кого возникло такое недоумение и, возможно, на него уже были даны ответы и, может быть, даже признание собственной ошибки…
Дополнительно гораздо более общий вопрос: А стоит ли учить Perl без большой нужды? Есть ли в нём какие-то эстетические достоинства или доступные прежде всего ему области применения? Регулярные выражения? Но они на сегодняшний день доступны в большинстве других языков непосредственно или через библиотеки (пусть даже их синтаксис заимствован из Perl).
тоже не совсем понятно: почему «истина» — число 1 (хотя как проверить, что это именно число, а не строка, — как в Perl узнать тип скалярного значения?)…
?
Как раз из обсуждения по ссылке можно заключить, что хотя в Perl, как и в большинстве сценарных языков при необходимости прозрачно производится неявное преобразование типов значений: чисел в их строковую запись, строк, являющихся записью чисел, в соответствующие числа — так, что в большинстве случаев невозможно обнаружить разницу, но в отдельных случаях она есть. Насколько я смог понять, она проявляется, например, при двоичных поразрядных действиях:
В других языках именно приводится, но сама переменная не меняется.
А в перле настолько неявно, что тип переменной меняется «самостоятельно» в самых неожиданных местах.
Алексей Тен, вот это сомнительно, по крайней мере, относительно превращения строки в число, — одно и то же число может быть записано по разному: в десятичном, шестнадцатеричном виде, с дополнительными нулями в конце дробной части… — и обратное преобразование не может быть однозначным.
Пример можно?
Алексей Тен, да, похоже, что переменные могут хранить значения одновремнно обоих типов: выглядит так, что при участии переменной со строковым значением в операциях для чисел (достаточно ничему не присваивающего $y + 0;) в ней замоминается и числовое значение, но и строковое не теряется.
Алексей Тен, нет переменная не превратится в число, но «запомнит» что была использована в числовом контексте (будут проставлен соответствующий флаг и сохранён результат преобразования).
$ perl -MDevel::Peek -E '$v = "1"; Dump($v); $v + 1; Dump($v)'
SV = PV(0xd93b20) at 0xdba238
REFCNT = 1
FLAGS = (POK,IsCOW,pPOK)
PV = 0xdbd000 "1"\0
CUR = 1
LEN = 10
COW_REFCNT = 1
SV = PVIV(0xdb6e50) at 0xdba238
REFCNT = 1
FLAGS = (IOK,POK,IsCOW,pIOK,pPOK)
IV = 1
PV = 0xdbd000 "1"\0
CUR = 1
LEN = 10
COW_REFCNT = 1