как назначить данные в хеш из входного файла - PullRequest
0 голосов
/ 11 октября 2018

Я новичок в Perl.Внутри моего входного файла:

james1
84012345

aaron5
2332111 42332
2345112 18238

wayne[2]
3505554

Вопрос: Я не уверен, как правильно получить ввод и установить имя в качестве ключа и число в качестве значений.Например, «james» - это ключ, а «84012345» - это значение.

Это мой код:

#!/usr/bin/perl -w
use strict;
use warnings;
use Data::Dumper;
my $input= $ARGV[0];
my %hash;
open my $data , '<', $input or die " cannot open file : $_\n";
my @names  = split ' ', $data;
my @values = split ' ', $data;
@hash{@names} = @values;
print Dumper \%hash;

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

ОК, +1 для использования strict и warnings.

Сначала взгляните на переменную $/ для управления тем, как файл разбивается на записи при его чтении.

$data - дескриптор файла, из которого необходимо извлечь данныефайл, если он не слишком большой, вы можете загрузить все это в массив, если это большой файл, вы можете перебирать каждую запись за раз.См. Оператор <> в perlop

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

%hash(
    james1 =>[
        84012345
    ],
    aaron5 => [
        2332111,
        42332,
        2345112,
        18238
    ]
    'wayne[2]' => [
        3505554,
    ]
)

См. perldscо том, как это сделать.

Вся документация может быть прочитана с помощью команды perldoc, которая поставляется с Perl.Запуск perldoc сам по себе даст вам несколько советов о том, как его использовать, а запуск perldoc perldoc даст вам гораздо больше информации, чем вам нужно в данный момент.

0 голосов
/ 11 октября 2018

Я перебираю ваш код очень быстро:

#!/usr/bin/perl -w

-w не рекомендуется.Вместо этого вы должны use warnings; (что вы уже делаете, поэтому просто удалите -w).

use strict;
use warnings;

Очень хорошо.

use Data::Dumper;
my $input= $ARGV[0];

ОК.

my %hash;

Не объявляйте переменные, пока они вам не понадобятся.Объявите их в наименьшей возможной области видимости, обычно непосредственно перед их первым использованием.

open my $data , '<', $input or die " cannot open file : $_\n";

В начале вашего сообщения об ошибке у вас есть ложное пространство, и $_ на этом этапе не установлен.Вместо этого вы должны включить $input (имя файла, который не удалось открыть) и $! (причина ошибки).

my @names  = split ' ', $data;
my @values = split ' ', $data;

Ну, это не имеет смысла.$data это дескриптор файла, а не строка.Даже если бы это была строка, этот код назначил бы один и тот же список для @names и @values.

@hash{@names} = @values;
print Dumper \%hash;

Моя версия (не проверено):

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

@ARGV == 1
    or die "Usage: $0 FILE\n";
my $file = $ARGV[0];

my %hash;
{
    open my $fh, '<', $file or die "$0: can't open $file: $!\n";
    local $/ = '';
    while (my $paragraph = readline $fh) {
        my @words = split ' ', $paragraph;
        my $key = shift @words;
        $hash{$key} = \@words;
    }
}

print Dumper \%hash;

Идея состоит в том, чтобы установить $/ ( разделитель входных записей ) на "" на время цикла ввода, что заставляет readline возвращать целые абзацы, а не строки.

Первое (через пробел) слово каждого абзаца считается ключевым;остальные слова являются значениями.

0 голосов
/ 11 октября 2018

Вы открыли файл с open() и прикрепили дескриптор файла к $data.Обычный способ чтения данных из файла - циклически проходить по каждой строке, например:

#!/usr/bin/env perl                                           
use strict;                                                   
use warnings;                                                 
use Data::Dumper;                                             

my $input = $ARGV[0];
my %hash;
open my $data , '<', $input or die " cannot open file : $_\n";
while (my $line = <$data>) {
    chomp $line; # Removes extra newlines (\n)
    if ($line) { # Checks if line is empty
        my ($key, $value) = split ' ', $line;
        $hash{$key} = $value;
    }
}
print Dumper \%hash;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...