繰り返し要素をチェックするときはいつでも、ハッシュを考えてください。たとえば、2つのファイルがあるとします。
File #1 File #2
Bob Tom
Ted Dick
Alice Harry
Carol Ted
ファイル#1にもあるファイル#2で名前を見つけることが仕事の場合は、ファイル#1の名前をハッシュで保存し、ファイル#2を調べながら、に一致する名前があるかどうかを確認します。あなたのハッシュ。
まず、ファイル#1を読みましょう。
use strict;
use warnings;
use autodie; #This way, I don't have to check open statements
open my $file_1, "<", "file_1";
my %first_file_name_hash;
while my $name (<$file_1>) {
chomp $name;
$first_file_name_hash{$name} = 1;
}
close $file_1;
これで、%first_file_name_hash
ファイル#1のすべての名前が含まれます。
次に、ファイル#2を開いて、次の手順を実行します。
open my $file_2, "<" "file_2";
while my $name (<$file_2>) {
if ($first_file_name_hash) {
print "User is in file #1 and file #2\n";
}
}
close $file_2;
はい、これはあなたが望んでいたものではありませんが、ハッシュを保存する方法についての良いアイデアを与えてくれます。
ハッシュには、値に関連付けられたキーがあります。各エントリには一意のキーが必要です。ただし、ハッシュの各エントリには重複する値が含まれる可能性があります。簡単なハッシュは次のとおりです。
$hash{BOB} = "New York";
$hash{CAROL} = "New York";
$hash{TED} = "Los Angeles";
$hash{ALICE} = "Chicago";
上記では、両方$hash{BOB}
と$hash{CAROL}
同じ値を持っています(ニューヨーク)。ただし、存在できるのは単一BOB
またはCAROL
ハッシュのみです。
ハッシュの大きな利点は、キーによって要素にアクセスするのが非常に簡単なことです。あなたは鍵を知っています、あなたは簡単に要素を持ち出すことができます。
あなたの場合、私は2つのハッシュを使用します。最初のハッシュでは、最初のファイルの全員の名前を$HASH_1に保存します。$HASH_2の2番目のファイルに全員の名前を保存します。それだけでなく、$HASH_2の値をファイルの次の行にします。
これはあなたに与えるでしょう:
$HASH_1{bob} = 1;
$HASH_1{tom} = 1;
$HASH_1{harry} = 1;
$HASH_2{bob} = a=1 b=2 c=3
d=4 e=5 f=6
$HASH_2{tom} = a1=34 b1=32 c1=3443
a2=534 b2=732 c2=673443
注:ハッシュの各エントリには1つの値の制限があるため、キーが。の行が2つ以上あるbob
場合は、それらを処理する方法を理解する必要があります。この場合、キーがすでにに存在する場合は$HASH_2
、NL値の後にキーを追加するだけです。
最新のPerlでは、配列をハッシュに格納できますが、あなたは初心者のPerlプログラマーなので、より単純なトリックに固執します。
これが完全にテストされていないプログラムです:
use strict;
use warnings;
use autodie;
use feature qw(say); #Better print that print
# Read in File #1
open my $file_1, "<", "F1.txt";
my %hash_1;
while my $name (<$file_1>) {
chomp $name;
$hash_1{$name} = 1;
}
close $file_1;
# Read in File #2 -- a bit trickier
open my $file_2, "<", "F2.txt";
my %hash_2;
while my $name (<$file_2>) {
chomp $name;
my $value = <$file_2>; #The next line
chomp $value;
next if not exists $hash_1{$name}; #Not interested if it's not in File #1
if (exists $hash_2{$name}) { #We've seen this before!
$hash_2{$name} = $hash_2{$name} . "\n" . $value; #Appending value
}
else {
$hash_2{$name} = $value;
}
}
close $file_2;
これで、必要な方法でデータを取得できます。%hash_2
必要なものがすべて含まれています。どのように印刷したいかわかりません。ただし、次のようになります。
my $counter = 1; #Used for file numbering..
foreach my $name (sort keys %hash_2) {
open my $file, ">", "A" . $counter . "txt";
say $file "$name"; #Name of person
my @lines = split /\n/, $hash_2{$key}; #Lines in our hash value
foreach my $line (@lines) {
say $file "$line";
}
close $file;
$counter++;
}
ハッシュを使用することで、多くの時間を消費してしまう可能性のある二重のforループを回避していることに注意してください。私は3つのループだけを通過します:最初の2つは各ファイルで読み込まれます。最後のファイルは2番目のファイルのハッシュを調べて、それを出力します。
ハッシュを使用することは、すでに読んだデータを追跡するための優れた方法です。