Perl - ассоциативный массив с индексом - PullRequest
0 голосов
/ 12 марта 2012

Хорошо, я новичок в Perl, но я думаю, что этот вопрос только для Perl Gurus:)

Мне нужен подробный пример того, как хранить и контролировать данные, прочитанные из файла.Я хочу сохранить их, используя ассоциативный массив с индексом, а затем использовать цикл for, чтобы перейти по массиву и распечатать его на экране.Например:

 my %array;

$array{$1} = [0]

foreach $array (sort values $array)
 print "$value";

Как то так.

Ответы [ 3 ]

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

Во-первых, Perl относится к ассоциативным массивам как к "хэшам". Вот простой пример чтения строк файла и сохранения их в хеше, чтобы вывести их в обратном порядке. Мы используем номер строки $. файла в качестве хеш-ключа и просто назначаем саму строку ($_) в качестве хеш-значения.

#!/usr/bin/env perl
use strict;
use warnings;
my %hash_of_lines;
while (<>) {
    chomp;
    $hash_of_lines{$.} = $_;
}
for my $lineno ( sort { $b <=> $a } keys %hash_of_lines ) {
    printf "%3d %s\n", $lineno, $hash_of_lines{$lineno};
}
1 голос
/ 12 марта 2012

Скорее всего, вы вообще не хотите использовать хеш (ассоциативный массив больше не является конструкцией perl).То, что вы описываете, использует массив.Хеши используются для хранения данных, связанных с уникальными ключами, массивов для последовательных данных.

open my $fh, "<", $inputfile or die $!;
my @array = <$fh>;
print @array;  # will preserve the order of the lines from the file

Конечно, если вы хотите отсортировать данные, вы можете сделать это с помощью print sort @array.

Теперь, если бы это было сделано с помощью хэша, вы бы сделали что-то вроде:

my %hash = map { $_ => 1 } <$fh>;
print sort keys %hash; # will not preserve order

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

Вы можете подумать: «Эй, а если я использую ключ другого типа и сохраню строку в качестве значения?»Ну, конечно, вы можете воспользоваться советом Дж. Р. Фергюсона и использовать числовой индекс.Но тогда вы используете массив, просто отказавшись от естественных преимуществ использования правильного массива.Вы на самом деле не получаете ничего, делая это, только теряете вещи.

1 голос
/ 12 марта 2012

Или даже проще с помощью метода slurp из IO :: All :

@lines = io('file.txt')->slurp;

Если вы читаете файл большего размера, вы, вероятно, захотите заблокировать файл, чтобы предотвратить условия гонкии IO :: All позволяет легко блокировать файлы во время работы с ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...