Perl: изменить элемент массива, который хэшируется на ключ - PullRequest
3 голосов
/ 15 июня 2011

У меня проблемы с моим Perl.Я хешировал ключ к массиву.Теперь я хочу изменить вещи в массиве для каждого ключа.Но я не могу понять, как это работает:

open(DATEBOOK,"<sample.file");

@datebook = <DATEBOOK>;

$person = "Norma";

foreach(@datebook){
    @record = ();
    @lines = split(":",$_);

        $size = @lines;
        for ($i=1; $i < $size; $i++){
            $record[$i-1] = $lines[$i];
        }
    $map{$lines[0]}="@record";  

}

for(keys%map){ print $map{$_}};

Файл ежедневника:

Tommy Savage:408.724.0140:1222 Oxbow Court, Sunnyvale,CA 94087:5/19/66:34200
Lesle Kerstin:408.456.1234:4 Harvard Square, Boston, MA 02133:4/22/62:52600
JonDeLoach:408.253.3122:123 Park St., San Jose, CA 94086:7/25/53:85100
Ephram Hardy:293.259.5395:235 Carlton Lane, Joliet, IL 73858:8/12/20:56700
Betty Boop:245.836.8357:635 Cutesy Lane, Hollywood, CA 91464:6/23/23:14500
William Kopf:846.836.2837:6937 Ware Road, Milton, PA 93756:9/21/46:43500
Norma Corder:397.857.2735:74 Pine Street, Dearborn, MI 23874:3/28/45:245700
James Ikeda:834.938.8376:23445 Aster Ave., Allentown, NJ 83745:12/1/38:45000
Lori Gortz:327.832.5728:3465 Mirlo Street, Peabody, MA 34756:10/2/65:35200
Barbara Kerz:385.573.8326:832 Ponce Drive, Gary, IN 83756:12/15/46:268500

Я пытался $map{$_}[1], но это не работает.Кто-нибудь может дать мне пример того, как это работает :)?

спасибо!

Ответы [ 2 ]

4 голосов
/ 15 июня 2011

Во-первых, используйте строгие и используйте предупреждения .Всегда.

Предполагая, что вы хотите получить хеш массивов, выполните что-то вроде этого:

use strict;
use warnings;

open my $datebookfh, '<', 'sample.file' or die $!;
my @datebook = <$datebookfh>;

my %map;
foreach my $row( @datebook ) { 
    my @record = split /:/, $row;
    my $key = shift @record;   # throw out first element and save it in $key

    $map{$key} = \@record;
}

Вы можете проверить, что у вас есть правильная структура, используя Data :: Dumper:

use Data::Dumper;
print Dumper( \%map );

Оператор \ получает ссылку.Все хэши и массивы в Perl содержат скаляры, поэтому составные структуры (например, хэши массивов) действительно являются хешами , ссылающимися на массивов.Ссылка похожа на указатель.

Прежде чем идти дальше, вы должны проверить:

3 голосов
/ 15 июня 2011

Другие дали вам отличный совет.Вот еще одна идея, которую стоит рассмотреть: храните свои данные в хэш-хешах, а не в хеш-массивах.Это делает структуру данных более коммуникативной.

# Include these in your Perl scripts.
use strict;
use warnings;

my %data;

# Use lexical files handles, and check whether open() succeeds.
open(my $fh, '<', shift) or die $!;

while (my $line = <$fh>){
    chomp $line;
    my ($name, $ss, $address, $date, $number) = split /:/, $line;
    $data{$name} = {
        name    => $name,
        ss      => $ss,
        address => $address,
        date    => $date,
        number  => $number,
    };
}

# Example usage: print info for one person.
my $person = $data{'Betty Boop'};
print $_, ' => ', $person->{$_}, "\n" for keys %$person;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...