2009-04-02 3 views
3

Я хочу, чтобы установить LIST_SEPARATOR в Perl, но все это я получаю это предупреждение:

Name "main::LIST_SEPARATOR" used only once: possible typo at ldapflip.pl line 7. 

Вот моя программа:

#!/usr/bin/perl -w 

@vals; 
push @vals, "a"; 
push @vals, "b"; 

$LIST_SEPARATOR='|'; 

print "@vals\n"; 

Я уверен, что я что-то очевидное отсутствует, но я не Посмотри.

Благодаря

+0

, если у вас «использовать строгий;» в верхней части кода вы получили бы признанный слегка критический «Глобальный символ» $ LIST_SEPARATOR «требует явного имени пакета» (не предупреждение), что является способом Perl сказать, что переменная не была объявлена. – mirod

+1

Неиспользование строгих правил - это как прокладка ленты, вырезанная из ствола дробовика, сначала на лоб и прохождение случайных прохожих, чтобы вытащить курок для вас. – singingfish

+0

Обычно лучше использовать прагму предупреждений вместо «-w». Вероятно, здесь это неважно, но я подумал, что упомянул об этом. – gpojd

ответ

9

perlvar ваш друг:

$LIST_SEPARATOR
$"

Это как $, за исключением того, что оно применяется к значениям массива и срез с интерполяцией в двойных кавычках строка (или аналогичная интерпретированная строка). Значение по умолчанию - это пробел. (Мнемоника: очевидно, я думаю.)

$LIST_SEPARATOR только имеющийся если вы use English; Если вы не хотите, чтобы use English; во всех программах, использовать $" вместо этого. Такая же переменная, просто с более кратким именем.

+0

Имейте это в виду. Одна переменная с двумя именами и только одна из них работает. : -S. Спасибо за помощь – Aaron

+2

Они будут работать, как только вы будете использовать английский модуль. – Geo

+0

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

12

только мнемонические доступен

$" = '|'; 

, если вы

use English; 

первым.

Как описано в perlvar. Прочтите документы, пожалуйста.

Следующие названия имеют особое значение для Perl. Большинство имен пунктуации имеют разумную мнемонику или аналоги в оболочках. Тем не менее, если вы хотите использовать длинные имена переменных, вам нужно только сказать

use English; 

в верхней части вашей программы. Это псевдонимы всех коротких имен для длинных имен в текущем пакете. У некоторых даже есть средние имена, обычно заимствованные из awk. В общем, лучше использовать

use English '-no_match_vars'; 

вызов, если вам не нужны $ PREMATCH, $ MATCH, или $ POSTMATCH, поскольку это позволяет избежать определенной производительности удара с использованием регулярных выражений. См. English.

2

вы должны использовать строгую прагму:

use strict; 

вы можете захотеть использовать диагностическую прагму, чтобы получить дополнительные удары о предупреждениях (которые вы уже включили с флагом -w):

use diagnostics; 
+0

Что-то, о чем я подумал - в ActivePerl или другом Perl на основе Windows (за исключением Cygwin) активно ли он ищет флаги в строке #!/Usr/bin/perl и, следовательно, понимает, что вы используете предупреждения, или это будет просто относитесь к нему как к другому комментарию? В принципе, #!/Usr/bin/perl -w переносится с Unix? –

+0

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

+0

@ Крис Лутц: да. perl сам разбирает #! line и обрабатывает флаги, если это необходимо, но на более позднем этапе запуска, чем если бы они были на самом деле в командной строке, вызывая некоторые незначительные различия. – ysth

7

Немного не по теме (вопрос уже хорошо ответил), но я не получаю привлекательность English.

Минусы:

  • Намного больше набрав
  • имен не более очевидной (то есть, я еще должны смотреть вещи)

Плюсы:

  • ?

Я могу видеть выгоду для других читателей - особенно людей, которые не знают Perl очень хорошо на всех. Но в том случае, если это вопрос сделать код более читаемым позже, я предпочел бы это:

{ 
    local $" = '|'; # Set interpolated list separator to '|' 
    # fun stuff here... 
} 
+0

Согласен, но я не могу проголосовать еще час. –

+0

Спасибо - я случайно ударил, пока мой пост был только полузакрытым. Поэтому я надеюсь, что теперь это имеет смысл. – Telemachus