2015-07-13 5 views
-1

Я начинающий программист, который пишет программу с использованием perl, которая в конечном итоге позволит мне искать имя и сообщить мне о ранних шагах. (с помощью многих хороших людей на здесь) у меня есть этот код для формата массива.Что такое эквивалентная хэш-функция массивов «push» в perl?

#!/usr/local/bin/perl 
use strict; 
use warnings; 

my @M_array; 
my @F_array; 
open (my $input, "<", 'ssbn1898.txt'); 
while (<$input>) { 

    chomp; 

    my ($name, $id) = split (/,/); 


    if ($id eq "M") { 

     push (@M_array, $name); 
    } 
    else { 
     push (@F_array, $name); 
    } 
} 
close ($input); 
print 'M: ' . join("\t", @M_array) . "\n"; 

print 'F: ' . join("\t", @F_array) . "\n"; 

И я пытался использовать один и тот же код, чтобы поместить его в хэш.

#!/usr/local/bin/perl 
use strict; 
use warnings; 

my %M_hash; 
my %F_hash; 
open (my $input, "<", 'ssbn1898.txt'); 
while (<$input>) { 

    chomp; 

    my ($name, $id) = split (/,/); 


    if ($id eq "M") { 

     push (%M_hash, $name); 
    } 
    else { 
     push (%F_hash, $name); 
    } 
} 
close ($input); 
print 'M: ' . join("\t", %M_hash) . "\n"; 
print 'F: ' . join("\t", %F_hash) . "\n"; 

Но я получить ошибку в функции «push». Я предполагаю тогда, что эта функция предназначена только для массивов. Существует ли эквивалентная функция на хэш? И что действительно делает функция «push»? Спасибо всем за вашу помощь

http://www.ourbabynamer.com/popular-baby-names.php?year=1898&top=1000&country=US&order=0&page=1 Это данные я работаю с

+2

«И что действительно делает функция« push »?» Perl имеет отличную встроенную документацию. В любое время, когда вы не знаете, что делает данная встроенная функция, я бы рекомендовал запустить 'perldoc -f ' в командной строке (в данном случае 'perldoc -f push'). Если в вашей системе установлен 'perldoc', это должно открыть документацию. Здесь [ссылка] (http://perldoc.perl.org/functions/push.html) на всякий случай, если он не установлен. – ThisSuitIsBlackNot

+2

'$ id' - плохое имя переменной. Это означает, что это уникальный идентификатор, но, по-видимому, это пол человека. – ikegami

+4

Вам действительно нужен достойный справочник по Perl, потому что, если вы думаете, что можете нажать на хэш, у вас есть некоторые фундаментальные недоразумения в том, что такое хэш. Есть [несколько книг] (http://shop.oreilly.com/category/browse-subjects/programming/perl.do), которые обеспечивают прочную основу для понимания, поэтому, если вы серьезно относитесь к Perl, d настоятельно рекомендуем найти тот, который соответствует вашим потребностям. – tadman

ответ

3

Пуш добавляет элемент к задней части массива.

@a = (1, 2, 3); 

push @a, 4; # @a is now (1, 2, 3, 4) 

Вставка добавляет элемент в хэш.

%h = (foo => 1, bar => 2); 

$h{ qux } = 3; # %h is now (foo => 1, bar => 2, qux => 3); 

Посмотрите на perldoc perlintro

http://perldoc.perl.org/perlintro.html

2

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

$hash{$key} = $val; 

Я не знаю, почему вы изменили массив на хэш. Нет смысла использовать хэш здесь. Решение состоит в том, чтобы вернуть ваши изменения.

+0

Я делаю это как назначение, поэтому должен использовать эти данные как массив и хэш. есть ли лучший способ достичь этого результата? – mgb16

+0

Я не вижу полезного способа использования хэша здесь. – ikegami

+0

В этом примере у меня есть [одно возможное предложение] (http://stackoverflow.com/a/31388155/7231) для хэшей для ботинка. –

1

толчка работает на массивах, далее по адресу: http://perldoc.perl.org/functions/push.html

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

my %hash = (key1 => "value1", key2 => "value2"); 
$hash{"key3"} = "value3"; 

Обратите внимание, что ключи должны быть уникальными.

Смотрите также:

1

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

Один из способов сделать это - хранить ваши данные в хеше массивов. Это будет выглядеть примерно так.

#!/usr/local/bin/perl 

use strict; 
use warnings; 
use 5.010; 

my %data; 

while (<>) { # Use <> to read from STDIN. Makes life easier :-) 
    chomp; 

    my ($name, $gender) = split /,/; 

    push @{$data{$gender}}, $name; 
} 

foreach (keys %data) { 
    say "$_: " . join("\t", @{$data{$_}_); 
} 

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

Одним из преимуществ этого подхода является то, что он будет продолжать работать (без изменений кода), если вы хотите добавить новые гендерные группы к вашим входным данным!

+1

В качестве второго предложения - предположим, что «имя» уникально и имеет хэш имен -> пол. Но, как вам нужно, чтобы «grep» это было массивным, это тоже немного искусственно. – Sobrique

0

Там нет никакой конкретной функции нажать элемент хэша, нужно просто присвоить значение хэш-ключ, как показано ниже -

$hash{key} = 'value'; 

Хотя он не будет уверен, что этот пункт будет добавлен в качестве последнего элемент, поскольку хеш хранит его ключи случайным образом,

Смежные вопросы