#perl #reference #operators
Вопрос:
% perl -e '$i = 9; $p = $i ; $q = $i; $i = "WTF"; print "$p $qn"'
9 WTF
Я ожидал , что и то, и другое работает одинаково и печатается 9 11
, так как ни предварительное, ни последующее приращение не могут использоваться в качестве значений в perl.
Это где-нибудь описано, имеет ли это какое-либо обоснование, или это просто сбой? Все, что я смог найти, касалось магических свойств оператора приращения при применении к нечисловым строкам, что кажется совершенно не связанным.
Обратите внимание, что это также относится к операторам декремента, это не вопрос приоритета оператора (добавление родителей или написание, поскольку ($p, $q) = ($i , $i)
это ничего не меняет), и это то же самое поведение в более старых версиях, таких как perl 5.6.
Я не спрашиваю о обходных путях (я знаю о том , как поставить точку int
между
и
, или добавить ноль и т. Д.).
Комментарии:
1. Вместо того чтобы использовать обходной путь к обходному пути, делайте
( my $anon = $i )
то, что четко определяет ваши намерения. Ясность здесь важна, так как это действительно странная вещь.
Ответ №1:
Пост-декремент возвращает старое значение $i
, поэтому он должен возвращать новый скаляр и делает это.
Предварительное уменьшение возвращает новое значение $i
, поэтому оно просто возвращается $i
. Нет смысла строить новый скаляр просто так.
Комментарии:
1. Спасибо, что это как-то имеет смысл с точки зрения реализации, но все равно кажется отрывочным. Конечно, они могли бы перехватить его во время компиляции и построить скаляр только в случае необходимости. Своего рода подобными случаями являются
//
amp;amp;
и||
операторы.2. Почему? Очень разумно указывать ссылку на скаляр, а еще меньше на анонимного. Нет абсолютно никакого смысла добавлять всю эту логику
3. немного притормози с этим 😉 как насчет установки
$/
режима записи? или создавать подстановки констант, подобные перечислению, без построения строк и их оценки?. Существует множество способов использования ссылок на анонимные скаляры (особенно когда вы используете perl для однострочных и тому подобного). Но в этом случае я бы сделал обратное-я бы разрешил
--
//
использовать,, и т. Д. В качестве значений. Даже если$a = ...
это не имеет большого смысла с операторами по умолчанию, это очень полезно приперегрузке. Но я оставлю это здесь-в мои намерения не входило начинать дискуссию «что, если».
4. Повторите » немного притормози с этим «, Вы только что перечислили два редких варианта использования, и оба они действительно плохие функции, у которых есть гораздо лучшие альтернативы. Таким образом, вы фактически повторяете то, что я сказал: очень мало смысла использовать скалярные ссылки. // Re » Я бы разрешил использовать в качестве значений ,—, / / и т. Д. «, Что без необходимости преобразует ошибки во время компиляции в ошибки во время выполнения. ПЛОХО! Есть причина, по которой у нас есть значения r.
5. Ах да, для
read ARGV
. И все же$/ = $i;
в этом нет никакого смысла. И constant.pm не использует$i
. Вы тут перечислили причины для создания констант, но не причины для использования скалярного ссылок, поэтому они совершенно неуместны. /// Так что, пока ты сумел придумать один пример полезного использования скалярной справки, вы можете придумать какие-либо примеры, которые выиграют от изменения существующей системы, а уж тем более причиной того, что оправдывало бы замедляется, и каждый на Perl программы и удаление безопасность ограничений.