-3

したがって、次の行を含むテキストファイルがあります。

123456789

しかし、2 番目のファイルがあります。

987654321

では、最初のファイルの内容keysをハッシュに、2 番目のファイルの値を にするにはどうすればよいvaluesでしょうか。(各文字はキー/値です)

各ファイルを異なる配列に保存してから、何らかの方法でそれらをマージする必要がありますか? どうすればいいですか?他に何か?

正直なところ、私が試したコードを紹介したいと思いますが、どこから始めればよいかまったくわかりません。

4

5 に答える 5

3

ハッシュスライスを使用できます。

各行がキー/値の場合: (s///r には 5.14 が必要ですが、以前のバージョン用に簡単に書き直すことができます)

my %h;
@h{ map s/\s+\z//r, <$fh1> } = map s/\s+\z//r, <$fh2>;

各文字がキー/値の場合:

my %h;
{
   local $/ = \1;
   @h{ grep !/\n/, <$fh1> } = grep !/\n/, <$fh2>;
}
于 2012-04-28T21:13:02.273 に答える
2

両方のファイルを開いて、1ずつ同時に読み取るだけです。

use strict; use warnings;
use autodie;

my %hash;
open my $keyFile, '<', 'keyfileName';
open my $valueFile, '<', 'valuefileName';

while(my $key = <$keyFile>) {
   my $value = <$valueFile>;
   chomp for $key, $value;       
   $hash{$key} = $value;
}

もちろん、これはそれがどのように機能するかについての簡単なスケッチです。

于 2012-04-28T21:08:04.330 に答える
1

OPは、各文字がキーまたは値であると述べています。これにより、出力は( 1 => 9, 2 => 8, ... ). OPはまた尋ねます:

各ファイルを異なる配列に保存してから、何らかの方法でそれらをマージする必要がありますか? どうすればいいですか?

これがまさにこの答えの仕組みです。これget_charsは、各ファイルを読み取り、すべての文字で分割し、その配列を返す関数です。次にzipfromList::MoreUtilsを使用してハッシュを作成します。

#!/usr/bin/env perl

use strict;
use warnings;

use List::MoreUtils 'zip';

my ($file1, $file2) = @ARGV;

my @file1chars = get_chars($file1);
my @file2chars = get_chars($file2);

my %hash = zip @file1chars, @file2chars;

use Data::Dumper;
print Dumper \%hash;

sub get_chars {
  my $filename = shift;
  open my $fh, '<', $filename 
    or die "Could not open $filename: $!";

  my @chars;
  while (<$fh>) {
    chomp;
    push @chars, split //;
  }
  return @chars;
}
于 2012-05-05T15:47:09.953 に答える
0

イテレータの狂気:

#!/usr/bin/env perl

use autodie;
use strict; use warnings;

my $keyfile_contents = join("\n", 'A' .. 'J');
my $valuefile_contents = join("\n", map ord, 'A' .. 'E');

# Use get_iterator($keyfile, $valuefile) to read from physical files

my $each = get_iterator(\ ($keyfile_contents, $valuefile_contents) );

my %hash;
while (my ($k, $v) = $each->()) {
    $hash{ $k } = $v;
}

use YAML;
print Dump \%hash;

sub get_iterator {
    my ($keyfile, $valuefile) = @_;

    open my $keyf, '<', $keyfile;
    open my $valf, '<', $valuefile;

    return sub {
        my $key = <$keyf>;
        return unless defined $key;
        my $value = <$valf>;
        chomp for grep defined, $key, $value;
        return $key => $value;
    };
}

出力:

C:\temp> yy
---
あ:65
乙: 66
子:67
日: 68
え:69
ふ:~
ガ:〜
ひ:~
私:〜
じ:~
于 2012-04-28T22:34:16.267 に答える
-1

I would write

my %hash = ('123456789' => '987654321');
于 2012-04-28T21:12:15.940 に答える