Я должен использовать $hash {“строка”} или $hash {строка} в Perl?

Можно взглянуть здесь о типах примитивов в Java.

главный интерес между этими типами использование памяти. Например, интервал использование 32 бита, в то время как байт только использование 8 битов.

Предполагают, что Вы работаете над большой структурой (массивы, матрицы...), тогда Вы будете лучше заботиться о типе, который Вы используете для сокращения использования памяти.

9
задан Simon Hayter 31 January 2013 в 19:40
поделиться

7 ответов

From perldata perldoc:

In fact, an identifier within such curlies is forced to be a string, as is any simple identifier within a hash subscript. Neither need quoting. Our earlier example, $days{'Feb'} can be written as $days{Feb} and the quotes will be assumed automatically. But anything more complicated in the subscript will be interpreted as an expression. This means for example that $version{2.0}++ is equivalent to $version{2}++, not to $version{'2.0'}++

So yes fundamentally identical. However beware of gotchas:

sub is_sub { 'Yep!' }

my %hash;
$hash{ is_sub   } = 'Nope';
$hash{ is_sub() } = 'it is_sub!!';

say Dumper \%hash;

Will show:

$VAR1 = { 'is_sub' => 'Nope', 'Yep!' => 'it is_sub!!' };

My preference is for the bareword... but remember those () or a preceding + (see jrockway's comment and answer) if you're calling a sub ;-)

13
ответ дан 4 December 2019 в 06:01
поделиться

Функционально они идентичны, то есть до тех пор, пока в вашем ключе не будет пробела или другого не буквенно-цифрового символа. Затем вы должны использовать подход, заключенный в кавычки.

Я предпочитаю не цитировать и использовать имена, содержащие alpha_num и символ подчеркивания. Это позволяет мне не цитировать большую часть времени.

12
ответ дан 4 December 2019 в 06:01
поделиться

Избегание кавычек более идиоматично.

Добавьте:

Цитирование не является решением для абсолютной читабельности. Обратите внимание на несоответствие здесь:

sub function() { 'OH HAI' }
my @list = ('foo', 'bar', function); 
# ==> ('foo', 'bar', 'OH HAI')

my %hash;
$hash{'foo'} = 1;
$hash{'bar'} = 2;
$hash{function} = 3;
# ==> { foo => 1, bar => 2, function => 3 } (oops)

Когда вы никогда не цитируете строки, "странные" вещи визуально отличаются от простых строк ... и они анализируются правильно.

$hash{foo} = 1;
$hash{bar} = 2;
$hash{+function} = 3; # aha, this looks different... because it is
# ==> { foo => 1, bar => 2, 'OH HAI' => 3 }

(Подсветка синтаксиса Stack Overflow мешает этому, поэтому попробуйте игнорируйте это.)

8
ответ дан 4 December 2019 в 06:01
поделиться

Из педантизма я всегда цитирую свои строковые ссылки в хэше. Это гарантирует, что у меня не будет ошибок [1].

[1] Я довольно консервативен в своем программировании на Perl.

7
ответ дан 4 December 2019 в 06:01
поделиться

Форма без кавычек предпочитается большинством, потому что она более лаконична и лаконична, пока хеш-ключ ограничен буквенно-цифровыми символами и подчеркиванием. Кроме того, почти любой редактор с поддержкой синтаксиса Perl знает, как выделить их как строки, несмотря на то, что они не заключены в кавычки.

Следует отметить, что вы можете получить такое поведение не только при использовании хеш-ключей, но и при определении хешей, передаче аргументов или даже при определении списков, когда вы используете => . Это может помочь визуально отличить ваши ключи от ваших значений в первых двух случаях. Примеры:

# Hash construction
my %hash = ( 
    key1 => "val1",
    key2 => "val2" 
);

# Subroutine arguments
some_function( arg1 => "val1", arg2 => $val2);
sub some_function { my %args = @_; }; # arguments are pulled in as a hash

# List construction (of course, not sure why you'd do this...)
my @list = (Foo => "bar");
print @list; # prints Foobar

С учетом всего сказанного, я начал все цитировать, и от этой привычки было трудно избавиться. Как-то кажется «безопаснее» цитировать хеш-ключи даже после стольких лет.

7
ответ дан 4 December 2019 в 06:01
поделиться

The latter format, $hash{string}, is more concise, but it only works for alphanumerics and underscores.

4
ответ дан 4 December 2019 в 06:01
поделиться

Вы всегда должны $ hash {"строка"} , если только вы хотите $ hash {string} .

0
ответ дан 4 December 2019 в 06:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: