Почему я могу создать ссылку на значение из выражения после приращения, но не из выражения до приращения?

#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 программы и удаление безопасность ограничений.