Кто-то имеет представление о том, чтобы использовать переменную массива вместо массива (списка) буквального, в use
функции заявления о, например:Perl: Использование модуля @list
my @list = qw(foo zoo);
use Module @list;
вместо
use Module qw(foo zoo);
так что она пишет, например:
my @consts = qw(PF_INET PF_INET6);
use Socket @consts;
printf "%d, %d\n", PF_INET, PF_INET6;
, который, казалось бы, работает, как ожидалось:
2, 10
Затем она делает это с каким-либо другим модулем, например, Time::HiRes
. Вместо
use Time::HiRes qw(CLOCK_REALTIME CLOCK_MONOTONIC);
printf "%d, %d\n", CLOCK_REALTIME, CLOCK_MONOTONIC;
0, 1
она делает:
my @consts = qw(CLOCK_REALTIME CLOCK_MONOTONIC);
use Time::HiRes @consts;
printf "%d, %d\n", CLOCK_REALTIME, CLOCK_MONOTONIC;
0, 0
Он вдруг не работает, как он работал с Socket
модуль! Здесь что-то плохое.
(.. это в нестрогой среде Если она использовала use strict
, она бы даже получила ошибку С другой стороны, она не получает никакого намека на все в своем первом, казалось бы, рабочим пример -.., Даже если она имеет use strict; use warnings; use diagnostics
там.)
Теперь она хочет изучить это странное поведение. Пытается импортирующие пустой список:
my @consts =();
use Socket @consts;
printf "%d, %d\n", PF_INET, PF_INET6;
2, 10
удивительно работает так же, в то время как он, вероятно, не стоит, как:
use Socket();
printf "%d, %d\n", PF_INET, PF_INET6;
0, 0
Затем она немного копается в этих модулях и понимает, что разница между этими двумя модулями заключается в том, что эти константы не равны @EXPORT
ed соответственно.
Ее вывод в том, что use Module @list
не работает, как она ожидает.
Что было бы лучшим объяснением этого? Что она делает неправильно - Каков правильный способ использования предварительно определенного массива в инструкции use
?
Re "Tries импорт пустого списка ... на удивление работает также", Почему? 'use foo @foo;' не отличается от 'use foo;'. Оба предоставляют пустой список.'use foo();' также будет передавать пустой список, но это специальный * синтаксис *. – ikegami