所以我有一个包含以下行的文本文件:
123456789
但是我有第二个文件:
987654321
那么如何使第一个文件的内容成为哈希中的keys
,而第二个文件的值成为values
?(每个字符都是一个键/值)
我应该将每个文件存储到不同的数组中,然后以某种方式合并它们吗?我该怎么做?别的东西?
老实说,我会给你我尝试过的代码,但我丝毫不知道从哪里开始。
您可以使用哈希片。
如果每一行都是一个键/值:(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>;
}
只需打开两个文件并同时逐行读取它们:
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;
}
当然,这只是关于它如何工作的快速草图。
OP 提到每个字符都是一个键或值,我认为你的意思是输出应该是像 ( 1 => 9, 2 => 8, ... )
这样的哈希。OP还问:
我应该将每个文件存储到不同的数组中,然后以某种方式合并它们吗?我该怎么做?
这正是这个答案的工作原理。这里get_chars
是一个函数,它读取每个文件,在每个字符上拆分并返回该数组。然后使用 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;
}
迭代器疯狂:
#!/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乙: 66C: 67深:68E: 69女:~G: ~H: ~我:~J: ~
我会写
my %hash = ('123456789' => '987654321');