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

Являются ли котировки вокруг хеш-ключей хорошей практикой в ​​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';
4b9b3361

Ответ 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

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