动态填充哈希:一个文件中的键和另一个文件中的值

时间:2012-04-28 21:03:13

标签: perl file file-io hash

所以我有一个包含以下行的文本文件:

  

123456789

但是我有第二个文件:

  

987654321

那么如何在散列中将第一个文件的内容设为keys,将第二个文件的值设为values? (每个字符都是键/值)

我应该将每个文件存储到不同的数组中然后以某种方式合并它们吗?我该怎么办?还有什么吗?

老实说,我会给你我尝试的代码,但我没有任何想法从哪里开始。

5 个答案:

答案 0 :(得分: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>;
}

答案 1 :(得分:2)

同时open两个文件和read them line by line

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;
}

当然,这只是它如何运作的快速草图。

答案 2 :(得分:1)

OP提到每个字符都是键或值,我认为你的意思是输出应该是像( 1 => 9, 2 => 8, ... )这样的哈希值。 OP也问:

  

我应该将每个文件存储到不同的数组中然后以某种方式合并它们吗?我该怎么做?

这正是这个答案的工作原理。这里get_chars是一个函数,它读入每个文件,拆分每个char并返回该数组。然后使用List::MoreUtils中的zip创建哈希值。

#!/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;
}

答案 3 :(得分: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
---
A: 65
B: 66
C: 67
D: 68
E: 69
F: ~
G: ~
H: ~
I: ~
J: ~

答案 4 :(得分:-1)

我会写

my %hash = ('123456789' => '987654321');