Подмножество хеш-ключей в Perl - PullRequest
4 голосов
/ 12 марта 2019

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

my $file = "test.csv";
open my $fh, "<", $file or die "$file: $!";

my $csv = Text::CSV->new ({
  binary    => 1, # Allow special character. Always set this
  auto_diag => 1, # Report irregularities immediately
  });
$csv->column_names ($csv->getline ($fh)); # use header
while (my $row = $csv->getline_hr ($fh)) {
  print $row->{column_name};
}

Внутри цикла while я хотел бы получить хеш, в котором есть только нужные мне столбцы, а не вся запись. Я подумал, что есть способ сделать это с помощью хэшей:

@hash{qw(header_one header_two)}

Но в моем случае $row - это не хеш, а ссылка (я прав в этом?), Поэтому я не могу понять, как добиться того, что мне нужно. Ценю некоторую помощь! Спасибо!

1 Ответ

2 голосов
/ 12 марта 2019

Как правило, вы можете использовать ссылку (или выражение, которое создает ссылку) в любом синтаксисе, заменив имя переменной ссылкой в ​​блоке {}.Итак:

@hash{qw(header_one header_two)}

будет

@{$row}{qw(header_one header_two)}

или

@$row{qw(header_one header_two)}

({} можно опустить, если ссылка является простой скалярной переменной).

Но это всего лишь фрагмент хеша, возвращающий два значения;если вы хотите список ключей / значений, используйте взамен раздел ключ / значение (новый в perl 5.20):

my %slice = %$row{qw(header_one header_two)};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...