Похоже, что проблема возникает, если вы случайно выбрасываете повторяющееся число, затем выбрасываете новое число и случайно выбрасываете estratti[0]
. Вы устанавливаете j=0
, когда вы найдете дубликат, но в следующий раз вы проверяете, находится ли numero==estratti[j]
в следующей итерации цикла. К тому времени j
был увеличен j++
до 1
, поэтому вы пропустите этот случай.
Чтобы исправить это, вы можете установить j = -1
, если найдете повторяющийся номер.
Пространство имен Local::
было зарезервировано для просто этой цели. Никакой модуль, который запускается с того префикса, не будет принят к CPAN или ядру. С другой стороны, можно использовать подчеркивание на имя верхнего уровня (как My_Corp::Session
или всего My_Session
). Все категории с подчеркиванием были также зарезервированы. (Это упоминается в [1 112] perlmodlib под "Выбором название модуля".)
Примечание, которое оба того резервирования применяет только к имени верхнего уровня. Например, существуют модули CPAN, названные Time::Local
и Text::CSV_XS
. Но Local::Time
и Text_CSV::XS
резервируются имена и не был бы принят на CPAN.
модули Именования после того, как Ваша компания прекрасна также. (Ну, если Вы не работаете на некоторую действительно универсальную звучащую компанию.) Используя обратное доменное имя, вероятно, излишество, если Вы не намереваетесь распределить свои модули другим. (Но в этом случае, необходимо, вероятно, зарегистрировать нормальное имя модуля.)
, Как Perl разрешает конфликт:
Perl ищет каталоги в @INC
для модуля с указанным именем. Первый найденный модуль является используемым тем. Таким образом, порядок каталогов в @INC
определяет, какой модуль использовался бы (если у Вас есть модули с тем же именем, установленным в различных местоположениях).
perl -V
сообщит о содержании [1 110] (каталоги самого высокого приоритета перечислены сначала). Но существует много способов управлять @INC
во времени выполнения, также.
BTW, Perl 6 будет в состоянии к [1 113] дескриптор несколько модулей с тем же именем различными авторами и даже использовать больше чем один в единственной программе. Но это не решает Вашу проблему теперь.
Нет ничего плохого в том, чтобы называть ваши внутренние модули в честь вашей компании; Я всегда так делаю. 90% моего кода заканчиваются на CPAN, поэтому у него «нормальные» имена, но внутреннее содержимое всегда начинается с ClientName::
.
Я уверен, что все остальные тоже делают это.
Что случилось только с выбором названия Вашего пакета, который Вы любите и затем гугление "жемчуга the-name-you-picked"?
При необходимости в максимальном уровне уверенности, что имя модуля не будет конфликтовать с чужим, можно взять страницу из книги Java: назовите модуль с названием домена компаний. Таким образом, если бы Вы работаете, например, Inc. и их доменным именем является example.com, Вы назвали бы свой модуль синтаксического анализатора HTML Com:: Пример:: HTML:: Синтаксический анализатор или Пример:: Com:: HTML:: Синтаксический анализатор. Преимущество первого - то, что, если у Вас есть несколько подблоков, у них может все быть свое пространство собственного имени, но модули все еще отсортируют вместе:
, но это действительно выглядит нечетным сначала.
(я знаю, что этот пост старый, но, поскольку мне пришлось разбираться с этим в последние несколько месяцев, я думал, что буду взвешивать)
На работе мы решили, что «Local :: чувствовал себя слишком географическим. У CompanyName :: тоже были некоторые проблемы, не связанные с разработкой, я их пропущу, хотя и скажу, что CompanyName длинная, когда ее нужно набирать десятки раз.
Итак, мы остановились на «Наше ::». Конечно, мы не «CPAN Safe», поскольку может быть день, когда мы захотим использовать модуль CPAN с префиксом Our ::. Но это приятно.
Our :: Data - это наш модуль Class :: DBI. Our :: App - это наша универсальная среда приложения, которая выполняет обработку конфигурации и Getopt.
Приятно читать и приятно печатать.
@INC
переменная содержит список каталогов к, в котором можно искать модули. Это запускается с первой записи и затем идет дальше к следующему, если это не находит модуль запроса. @INC
имеет значение по умолчанию, которое создало, когда жемчуг компилируется, но банка можно изменить его с PERL5LIB
переменная среды, lib
прагма и непосредственно управление @INC
массив в a BEGIN
блок:
#!/usr/bin/perl
BEGIN {
@INC = (); #no modules can be found
}
use strict; #error: Can't locate strict.pm in @INC (@INC contains:)