Почему там такое “волшебство” в Perl?

Просмотр perlsub и perlop страниц справочника, я заметил, что существует много ссылок на "волшебный" и "волшебное" там (просто ищут любого из них для "волшебства"). Интересно, почему Perl так богат ими.

Некоторые примеры:

print ++($foo = 'zz')            # prints 'aaa'       
printf "%d: %s", $! = 1, $!      # prints '1: Operation not permitted'
while (my $line = ) { ... }  # $line is tested for definedness, not truth
use warnings; print "0 but true" + 1  # "0 but true" is a valid number!

15
задан Jonathan Leffler 24 May 2015 в 20:28
поделиться

6 ответов

Когда функция Perl описывается как «волшебная»:

Это означает, что эта функция реализована звездой НБА Мэджиком Джонсоном. Каждый раз, когда Perl выполняет «магию», он фактически отправляет вызов RPC на удаленный приемник, имплантированный в Magic . Он вычисляет ответ, а затем отправляет ответное сообщение. Использование г-на Джонсона для всех сложных частей Perl обеспечивает отличный уровень абстракции и упрощает перенос на новые платформы. Это намного проще, чем, скажем, портативная среда выполнения Apache.

Источник: перрин на Perl Monks

Официально! Perl более волшебный.

Результаты следующих поисков Google:

 25  site:ruby-doc.org     magic
 36  site:docs.python.org  magic
497  site:perldoc.perl.org magic
45
ответ дан 30 November 2019 в 23:47
поделиться

Интересно, почему Perl так богат ими.

Чтобы упростить задачу.

Вы обнаружите, что самая "магия" Perl - это упрощение синтаксиса для общих задач.

14
ответ дан 30 November 2019 в 23:47
поделиться

Магия на языке Perl - это просто слово, присваиваемое атрибутам, применяемым к переменным / функциям, которые позволяют расширить их функциональность. Некоторые из этих функций доступны непосредственно из Perl, а некоторые требуют использования C api.

Прекрасным примером магии является интерфейс tie , который позволяет вам определять собственную реализацию переменной. Каждая операция, которая может быть выполнена с переменной (например, получение или сохранение значения), предоставляется для повторной реализации, что позволяет создавать элегантные и логичные синтаксические конструкции, такие как хэш со значениями, хранящимися на диске, которые прозрачно загружаются и сохраняются за кулисами.

Magic также может относиться к особым способам поведения определенных встроенных функций, например, как первый аргумент map или grep может быть либо блоком, либо простым выражением:

my @squares = map {$_**2} 1 .. 10;
my @roots   = map sqrt, 1 .. 10;

, что не является поведением, доступным для пользовательских подпрограмм.

Многие другие возможности Perl, такие как перегрузка операторов или переменные, которые могут возвращать разные значения при использовании с числовыми или строковыми операторами, реализованы с помощью магии. Контекст тоже можно рассматривать как магию.

Короче говоря, магия - это любое время, когда конструкция Perl ведет себя не так, как предполагала бы наивная интерпретация, исключение из правил. Магия, конечно, очень мощная, и ею нельзя пользоваться без особой осторожности. Мэджик Джонсон, конечно, участвует в выполнении всей магии (см. Ответ FM), но это выходит за рамки данного объяснения.

25
ответ дан 30 November 2019 в 23:47
поделиться

Потому что perl always D oes W hat I M ean для некоторых значений always.

13
ответ дан 30 November 2019 в 23:47
поделиться

Я думаю (скорее мнение, чем факт), что это связано с точкой зрения органического роста, которую создатель Perl Ларри Уолл придерживается в отношении языка Perl. Python является примером противоположного подхода, чей стиль часто заставляет хакеров Perl содрогаться от ощущения, что их принуждают соответствовать стилистическому режиму.

Отчасти это связано с тем, что Perl был разработан для "эффективного" написания быстрых скриптов для выполнения задач, похожих на Perl*, как по времени, так и по количеству нажатий клавиш. Отчасти это связано с TMTOWTDI мантрой Perl и его последователей.

Программисты склонны расходиться во мнениях относительно частого использования "магии" в Perl, для одних это утомляющая глаз визуальная какофония хаоса и неуважения к упорядоченности (что напоминает о временах компьютерного священства в белых лабораторных халатах за стеклянным окном), для других это яркий пример эффективного выполнения задач, пусть и не всегда очевидного для новичка или стороннего наблюдателя.

3
ответ дан 30 November 2019 в 23:47
поделиться

Философия проектировать Perl заключается в том, что простые вещи должны быть простыми. Это звучит хорошо, и в какой-то степени это так. Тем не менее, существует компромисс: Делая каждую простую вещь один лайнер приводит к тоннам специальных случаев взломов, чтобы сохранить несколько строк кода. Разные люди имеют разные предпочтения относительно того, чтобы сделать простые операции внутри языка простыми, а не сделать спецификацию языка простой. Перл в одной крайности. Java на другой, по крайней мере среди языков, которые люди на самом деле используют. Python и C # находятся где-то между ними.

2
ответ дан 30 November 2019 в 23:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: