2012-03-12 3 views
0

[OK]をクリックして連想配列が、私はPerlのに新しいですが、私はこの質問にはPerlの達人のために、私は井戸から読み出されたデータのコントロールを格納しておく方法の一例を説明する必要がある唯一:)のPerl - インデックス

で薄くファイル。 インデックスを持つ連想配列を使用してそれらを保存し、その後、forループを使用して配列を移動し、それを画面に出力します。 例:

my %array; 

$array{$1} = [0] 

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

このようなものです。

答えて

2

まず、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}; 
} 
+5

Perlはハッシュを「連想配列」と呼んでいましたが、それは入力が多すぎるため、1994年にPerl 5がリリースされたときに停止しました。最近では、この用語は恐ろしく古くなったリソースからPerlを学んだことがあります: –

+3

、または恐ろしく古いPerl風の言語でプログラミングすることを学んだ人。 – mob

+0

@davorg:ありがとうと感謝します。 – JRFerguson

1

それともIO::Allから吸い込み方法を経由しても、簡単に:あなたは、おそらくレース条件やIOを防ぐために、ファイルをロックすることになるでしょう大きなファイルを読んでいる場合

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

::すべてはそれを作りますあなたがそれらを使って作業している間、ファイルを本当に簡単にロックすることができます。

1

ほとんどの場合、ハッシュ(連想配列はもはや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 

をそして、あなたが見ることができるように、最終的な結果は、あなたが、元の順序を保持していないだけということですファイルではなく、代わりににはをソートするか、セミランダムな順序を取得する必要があります。あなたが同じ行を持っていれば、すべての間、あなたはキーを上書きするリスクがあります。これはデデュープデータには有効ですが、ファイル内容の真の表現には適していません。

あなたは、「ちょっと、別の種類のキーを使用してその行を値として保存するとどうなりますか?」と思うかもしれません。まあ、もちろん、JRFergusonのアドバイスを受けて数値指標を使用するかもしれません。しかし、適切な配列を使用することの自然な利点を排除するために、配列を使用しています。あなたは実際にはゲイン何もこれを行うことで、物事を失うものではありません。