Являются ли котировки вокруг хеш-ключей хорошей практикой в Perl?
Полезно ли процитировать ключи при использовании хэша в Perl?
Я работаю над чрезвычайно большой базой Perl-кода и стараюсь использовать множество лучших практик, предложенных Дамианом Конвей в Perl Best Practices. Я знаю, что лучшие практики - это всегда трогательная тема с программистами, но, надеюсь, я смогу получить хорошие ответы на эту тему без начала пламенной войны. Я также знаю, что это, вероятно, то, что многие люди не будут спорить из-за того, что это второстепенная проблема, но я пытаюсь получить твердый список рекомендаций, чтобы следовать, когда я прокладываю себе путь через эту базу кода.
В книге Perl Best Practices Дамиана Конвея приведен пример, показывающий, как выравнивание помогает разборчивости раздела кода, но оно не упоминает (где-нибудь в книге, которую я могу найти) о цитировании хеш-ключей.
$ident{ name } = standardize_name($name);
$ident{ age } = time - $birth_date;
$ident{ status } = 'active';
Разве это не было бы лучше написано кавычками, чтобы подчеркнуть, что вы не используете голые слова?
$ident{ 'name' } = standardize_name($name);
$ident{ 'age' } = time - $birth_date;
$ident{ 'status' } = 'active';
Ответы
Ответ 1
При указании константных хеш-ключей строки вы всегда должны использовать (одиночные) кавычки. Например, $hash{'key'}
Это лучший выбор, поскольку он устраняет необходимость думать об этой проблеме и приводит к согласованному форматированию. Если вы иногда оставляете кавычки, вы должны помнить о том, чтобы добавлять их, когда ваш ключ содержит внутренние подменю, пробелы или другие специальные символы. Вы должны использовать кавычки в этих случаях, что приводит к несогласованному форматированию (иногда не цитируется, иногда цитируется). Квотные ключи также, скорее всего, будут синтаксически выделены вашим редактором.
Здесь пример, когда использование соглашения "цитируется иногда, не цитируется в другое время" может вызвать у вас проблемы:
$settings{unlink-devices} = 1; # I saved two characters!
Это будет прекрасно компилироваться под use strict
, но не будет делать то, что вы ожидаете во время выполнения. Хеш-клавиши - это строки. Строки должны быть указаны как соответствующие для их содержимого: одинарные кавычки для буквенных строк, двойные кавычки, чтобы разрешить переменную интерполяцию. Введите свои хэш-ключи. Это самое безопасное соглашение и самое простое понять и следовать.
Ответ 2
Без кавычек лучше. Это в {}, поэтому очевидно, что вы не используете простые слова, плюс его легче читать и печатать (два меньше символов). Но все это зависит от программиста, конечно.
Ответ 3
Я никогда не использую хеш-ключи с одной кавычкой. Я знаю, что {} в основном работает как кавычки, за исключением особых случаев (a + и double-quotes). Мой редактор тоже это знает и дает мне несколько цветовых сигналов, чтобы убедиться, что я сделал то, что хотел.
Использование одинарных кавычек везде кажется мне "защитной" практикой, совершаемой людьми, которые не знают Perl. Сохраните немного износа клавиатуры и изучите Perl:)
С разглагольством, истинная причина, по которой я публикую этот комментарий... другие комментарии, похоже, упустили тот факт, что +
будет "недооценивать" гобе. Это означает, что вы можете написать:
sub foo {
$hash{+shift} = 42;
}
или
use constant foo => 'OH HAI';
$hash{+foo} = 'I AM A LOLCAT';
Итак, довольно ясно, что +shift
означает "вызвать функцию сдвига", а shift
означает "сдвиг строки".
Я также укажу, что cperl-mode правильно отображает все различные случаи. Если это не так, пинг меня на IRC, и я исправлю это:)
(О, и еще кое-что. Я цитирую имена атрибутов в Moose, как в has 'foo' => ...
. Это привычка, которую я взял от работы со стеваном, и хотя я думаю, что это выглядит красиво... это бит, несовместимый с остальной частью моего кода. Возможно, я перестану это делать в ближайшее время.)
Ответ 4
Quoteless хеш-ключи получили внимание на синтаксическом уровне от Ларри Уолла, чтобы убедиться, что у них нет причин быть отличными от передовой практики. Не потейте кавычки.
(Кстати, кавычки на клавишах массива являются лучшей практикой в PHP, и могут быть серьезные последствия для отказа от их использования, не говоря уже о тоннах E_WARNINGs. Хорошо в Perl!= okay в PHP.)
Ответ 5
Я не думаю, что в этом есть лучшая практика. Лично я использую их в хеш-ключах так:
$ident{'name'} = standardize_name($name);
но не используйте их слева от оператора стрелки:
$ident = {name => standardize_name($name)};
Не спрашивайте меня, почему, это так, как я это делаю:)
Я думаю, что самое главное, что вы можете сделать, это всегда, всегда, всегда:
use strict;
use warnings;
Таким образом, компилятор поймает любые семантические ошибки для вас, оставив вам меньше шансов что-то ошибиться, в зависимости от того, как вы решите пойти.
И второе самое важное - быть последовательным.
Ответ 6
Я иду без кавычек, просто потому, что это меньше, чтобы печатать, читать и беспокоиться. Времена, когда у меня есть ключ, который не будет автокодироваться, немного и далеко друг от друга, чтобы не стоить всей дополнительной работы и беспорядка. Возможно, мой выбор хеш-ключей изменился в соответствии с моим стилем, что тоже хорошо.
Это по той же причине я использую "
по умолчанию. Для меня чаще распространять переменную в середине строки, чем использовать символ, который я не хочу интерполировать. То есть я чаще писал 'Hello, my name is $name'
, чем "You owe me $1000"
.
Ответ 7
По крайней мере, цитирование предотвращает синтаксис, выделяя зарезервированные слова в не очень совершенных редакторах. Выезд:
$i{keys} = $a;
$i{values} = [1,2];
...
Ответ 8
Пойдите с кавычками! Они визуально разбивают синтаксис, и больше редакторов будут поддерживать их в подсветке синтаксиса (эй, даже Qaru выделяет версию цитаты). Я также утверждаю, что вы заметили бы опечатки быстрее с редакторами, проверяющими, что вы закончили свою цитату.
Ответ 9
Я предпочитаю идти без кавычек, если мне не нужна некоторая интерполяция строк. И затем я использую двойные кавычки. Я уподобляю его буквальным цифрам. Perl действительно позволит вам сделать следующее:
$achoo['1'] = 'kleenex';
$achoo['14'] = 'hankies';
Но никто этого не делает. И это не помогает с ясностью, просто потому, что мы добавляем еще два символа для ввода. Так же, как иногда мы специально хотим использовать слот №3 в массиве, иногда мы хотим, чтобы запись PATH
отсутствовала %ENV
. Одиночное цитирование не дает ясности, насколько мне известно.
То, как Perl анализирует код, делает невозможным использование других типов "голых слов" в хэш-индексе.
Попробуйте
$myhash{shift}
и вы только получите элемент, хранящийся в хэше под ключом 'shift'
, вы должны это сделать
$myhash{shift()}
чтобы указать, что вы хотите, чтобы первый аргумент индексировал ваш хэш.
Кроме того, я использую jEdit, единственный визуальный редактор (который я видел - помимо emacs), который позволяет вам полный контроль над подсветкой. Так что это вдвойне ясно для меня. Все, что похоже на прежнее, получает KEYWORD3 ($ myhash) + SYMBOL ({) + LITERAL2 (shift) + SYMBOL (}), если перед закрытием курчавообразуется ключ KEYWORD3 + SYMBOL + KEYWORD1 + SYMBOL (()}). Плюс я, скорее всего, отформатирую его так:
$myhash{ shift() }
Ответ 10
Лучше с кавычками, потому что он позволяет использовать специальные символы, которые не разрешены в простых словах. Используя кавычки, я могу использовать специальные символы моего родного языка в хеш-ключах.
Ответ 11
Вы также можете предшествовать клавише с символом "-
" (минус-символ), но имейте в виду, что это добавляет "-
" к началу вашего ключа. Из моего кода:
$args{-title} ||= "Intrig";
Я использую одиночную цитату, двойную цитату и quoteless. Все в одной программе: -)
Ответ 12
Я сам это задавался, особенно когда обнаружил, что сделал несколько упущений:
use constant CONSTANT => 'something';
...
my %hash = ()
$hash{CONSTANT} = 'whoops!'; # Not what I intended
$hash{word-with-hyphens} = 'whoops!'; # wrong again
То, что я обычно делаю сейчас, - это применять кавычки универсально на основе хэш-хэда, если им нужен хотя бы один из буквенных ключей; и используйте круглые скобки с константами:
$hash{CONSTANT()} = 'ugly, but what can you do?';
Ответ 13
Я всегда использовал их без кавычек, но я бы повторил использование строгих правил и предупреждений, поскольку они выбирают большинство распространенных ошибок.