Обратные кавычки Perl в хеш-ссылке дают разные результаты

У меня есть файл с именем a.gz, который представляет собой файл, сжатый с помощью gzip, который содержит следующие строки при распаковке:

a
b

Ниже приведены два блока кода Perl, которые, как мне кажется, «должны» давать одинаковые результаты, но это не так.

Код №1:

use Data::Dumper;
my $s = {
        status => 'ok',
        msg    => `zcat a.gz`
};
print Dumper($s),"\n";

Код № 2:

use Data::Dumper;
my $content = `zcat a.gz`;
my $s = {
      status => 'ok',
      msg    => $content
};
print Dumper($s), "\n";

Код №1 дает следующий результат:

Odd number of elements in anonymous hash at ./x.pl line 8.
$VAR1 = {
          'msg' => 'a
',
          'b
' => undef,
          'status' => 'ok'
        };

Код № 2 возвращает следующий результат:

$VAR1 = {
          'msg' => 'a
b
',
          'status' => 'ok'
        };

Я использую perl 5.10.1, работающий в Linux.


person fat_apupu    schedule 04.06.2016    source источник


Ответы (1)


perldoc perlop:

В скалярном контексте он возвращается как одна (возможно, многострочная) строка или undef, если команда не удалась. В контексте списка возвращает список строк (однако вы определили строки с помощью $/ или $INPUT_RECORD_SEPARATOR) или пустой список, если команда не удалась.

Присвоение скаляру помещает `` в скалярный контекст; использование его в { ... } помещает его в контекст списка.

{ LIST } берет список и интерпретирует его содержимое, чередуя ключи и значения, то есть key1, value1, key2, value2, key3, value3, .... Если количество элементов нечетное, вы получите предупреждение (и отсутствующее значение принимается равным undef).

LIST , LIST (оператор запятой в контексте списка) объединяет два списка.

=> работает так же, как ,, но автоматически заключает в кавычки идентификатор слева от него (если он есть).

person melpomene    schedule 04.06.2016
comment
Спасибо. Я не знал, что назначение ключа/значения в {....} является контекстом массива. Я думал, что значения всегда скалярны. Спасибо за указание на это. - person fat_apupu; 04.06.2016