0

ファイルの内容をハッシュのハッシュと比較しようとしています。このために、まだ効果的ではありませんがmap、 、ifおよびを使用しています。exists

基本的に、ファイルの列 0 から 2 が hash に存在するかどうかを知りたいです。もしそうなら、列 3 が内部ハッシュのキーとして存在するかどうかを調べたいと思います。私の「古いファイル.txt」は、次のハッシュを生成するタブ区切りのファイルです。

古いファイル.txt:

A    s.av    u
B    s.bv    u
C    s.av    u
C    s.cv    m

ハッシュ:

my %oldhash = {
  'A' => {'s.av' => ['u']},
  'B' => {'s.bv' => ['u']},
  'C' => {'s.av' => ['u'], 's.cv' => ['m']},
};

「new file.txt」からの次のタブ区切りの列がハッシュに存在するかどうかを確認します。

D    Db    Dc    s.av   #cols 0 - 2 do not exist in hash
E    A     Ab    d.ef   #column 1 exists, but column 3 doesn't, so nothing is done
E    A     Ac    s.av   #col 1 and 3 exist, so the new file will have the value of $oldhash{A}{s.av}
B    Bb    B     s.bv   #col0 and 3 exist, so I'll include the value of $oldhash{B}{s.bv}

列 0 と列 2 の両方がハッシュに存在することに注意してください。ただし、列の 1 つだけが存在する必要があるため、これは重要ではありません。

u出力は、または他のファイルから取得する列を追加したテスト ファイルとまったく同じにすることができmます。例:

D    Db    Dc    s.av       #inserts empty column
E    A     Ab    d.ef       #inserts empty column
E    A     Ac    s.av   u   #with u inserted
B    Bb    B     s.bv   u   #with u inserted

これは私がこれまでに得たところですが、私は得ていexists argument is not a HASH or ARRAY element or a subroutine at myfile.pl line 24ます:

#!/usr/local/bin/perl
use strict;
use warnings;
use Data::Dumper;

my $dir='D:\\';

open my $oldfile, "<", "$dir\\old file.txt";
open my $newfile, "<", "$dir\\new file.txt";

my (%oldhash);

# creates the hash of hashes
while (my $odata = <$oldfile>){
    chomp $odata;
    my @oline = split /\t/, lc $odata;
    push @{$oldhash{$oline[1]}{$oline[2]}}, $oline[3];
}

# does the comparison between the file and the hash
while (my $newlines = <$newfile>){
    chomp $newlines;
    my @line = split /\t/, $newlines;
    if (exists map {$oldhash{$_}} @line[0..2]) {
        print $oldhash{$_};
    }
}

close $updatedtax;
close $oldtax;

あなたが私に与えることができるすべての助けに感謝します!前もって感謝します

4

1 に答える 1