Подтвердить что ты не робот

Каковы действительные значения возврата модуля Perl?

Общей практикой в ​​Perl является, конечно, завершение модулей с помощью 1;, поэтому запрос на запрос может быть проверен на успех. Есть ли причина, по которой возвращаемое значение не может быть другим истинным значением? В моем тестировании он не видит никаких проблем, но я хотел бы знать, столкнулся ли кто-нибудь с любыми проблемами (например, некоторые другие модули или прагмы или что-то, что ожидает, что значение действительно будет 1, а не просто верно).

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

4b9b3361

Ответ 1

Я надолго помещал глупые вещи в конце своих модулей. Там нет вреда и его маленькое пасхальное яйцо. uny2k помогает с "Yes, this code is a joke." Class:: Fields заполняется ими.

Сделав это еще на один шаг, иногда, когда функция документирована для возврата true и false, я верну что-то, отличное от 1 для true. Это должно наказывать людей, которые пишут if foo() == 1, когда они означают if foo(). Это было примерно в тот же период, когда я писал use constant TRUE => 1==1; use constant FALSE => !TRUE;

Я видел возвращаемое значение модуля, используемого в производственном коде. Я точно не помню, почему. Логика разработчика была... замучена. Я считаю, что это было что-то вроде того, что не хотелось писать одну строчку вместо двух. Я не помню, почему он не просто экспортировал его.

Это был тот же самый разработчик, который использовал %_ для передачи аргументов вокруг (символ *_ является глобальным для пакетов) и написал 150 операторов отображения строк внутри операторов карты.

Опасность использования возвращаемого значения, кроме обфускации, заключается в том, что он работает только один раз.

$ cat Foo.pm
package Foo;

return "Basset hounds got long ears";

$ cat test.plx
#!/usr/bin/perl -w

print require Foo, "\n";
print require Foo, "\n";

$ perl -I. test.plx
Basset hounds got long ears
1

Первый вызов require оценивает Foo.pm и возвращает возвращаемое значение. Второй вызов видит его уже в %INC и просто возвращает true. И вы даже не можете быть уверены, что вы первый раз требуете кода. Вы можете обойти это с помощью do "Foo.pm", но теперь вы каждый раз перезагружаете модуль предупреждениями о переопределенных процедурах, проблемами производительности и, возможно, повторной инициализацией глобальных переменных. Его не стоит.

Ответ 2

Я думаю (1) нет проблемы с возвратом какого-либо произвольного истинного значения из вашего модуля, но (2) есть большая проблема с неясным, чрезмерно умным кодом, который вы предлагаете использовать детали реализации модуля. Не делайте этого.

Ответ 3

Все допустимое возвращаемое значение. Если вы хотите, чтобы require преуспел, он должен быть истинным значением. Если вы не хотите, чтобы require преуспеть (например, неподдерживаемая платформа, отсутствующая библиотека), используйте значение false.

Чтобы узнать, что другие люди использовали в качестве возвращаемых значений, откройте Acme:: ReturnValue.

Люди не ожидают использовать возвращаемое значение для чего-либо, поэтому я не стал бы путать людей, пытаясь сделать это, как бы остроумно это ни казалось в то время.:)

Ответ 4

Mark Dominus, автор Perl более высокого порядка, объясняет мой любимый:

Я очень редко использовал $flag = 'Cogito ergo sum';, который, как все знает, по-видимому, верно во всех возможных вселенных. Это обеспечивает максимальная переносимость.

Ответ 5

Цель состоит в том, что если ваш модуль возвращает false, запрос может завершиться с ошибкой в ​​этой точке. Никто не заботится или не полагается на ценность, за исключением того, что она истинна или ложна.

Вы должны последовать примеру. Вы делаете это так, чтобы ваши модули зависели от фактического значения, кроме того, является ли оно истинным или ложным. В примере, который вы указали, например, если требуется выполнить возврат 1, запрос будет выполнен успешно, но ваш умный конструктор завершится с ошибкой.

Ответ 6

Одна вещь, с которой вы столкнетесь с require, заключается в том, что она возвращает значение возвращаемого модуля при первом загрузке модуля. Если модуль уже загружен, требуется вернуть 1, не загружая модуль снова.

Оператор do file будет перезагружать файл каждый раз и каждый раз возвращает возвращаемое значение файла. Я использовал его для хранения данных конфигурации в файле в виде анонимного хэша.