Arrays Perl:将文件加载到哈希中
我正在努力理解Perl中哈希背后的逻辑。任务是将文件加载到哈希中,并将值分配给使用此文件创建的键 文件包含字母表,每个字母在其自己的行上:Arrays Perl:将文件加载到哈希中,arrays,perl,file,hash,Arrays,Perl,File,Hash,我正在努力理解Perl中哈希背后的逻辑。任务是将文件加载到哈希中,并将值分配给使用此文件创建的键 文件包含字母表,每个字母在其自己的行上: a b c d e 等等,。 当使用数组而不是散列时,逻辑很简单:将文件加载到数组中,然后使用某个计数器($counter++)以相应的数字打印每个元素 但现在我的问题是,我如何将文件读入我的散列,分配自动生成的值,并以这样的方式对其进行排序,其中输出是这样打印的: a:1 b:2 c:3 foreach my $rec (@records) {
a
b
c
d
e
等等,。
当使用数组而不是散列时,逻辑很简单:将文件加载到数组中,然后使用某个计数器($counter++)以相应的数字打印每个元素
但现在我的问题是,我如何将文件读入我的散列,分配自动生成的值,并以这样的方式对其进行排序,其中输出是这样打印的:
a:1
b:2
c:3
foreach my $rec (@records)
{
$hash{$rec} = $counter++;
}
我尝试先创建数组,然后使用
%hash = @array
但是它使我的哈希不可排序。有很多方法可以实现这一点。最直接的方法是在读取文件时将数据加载到散列中
my %hash;
while(<>)
{
chomp;
$hash{$_} = $.; #Use the line number as your autogenerated counter.
}
尽管,如果你处于这种情况,这是一种更有害的做事方式
%hash = map { $array[$_] => $_ } @array;
将散列看作一组对(键、值),其中键必须是唯一的。您希望一次读取一行文件,并向哈希中添加一对:
$record = <$file_handle>;
$hash{$record} = $counter++;
等等。您仍然需要一个循环,或者像这样的显式循环:
a:1
b:2
c:3
foreach my $rec (@records)
{
$hash{$rec} = $counter++;
}
或者像下面这样的一个隐含的:
%hash = map {$_ => $counter++} @records;
# or:
$hash{$_} = $counter++ for @records;
此代码应生成正确的输出,其中
my text file
是数据文件的路径:
my %hash;
my $counter = 0;
open(FILE, "my-text-file");
while (<FILE>) {
chomp;
$counter++;
$hash{$_} = $counter;
}
# Now to sort
foreach $key (sort(keys(%hash))) {
print $key . ":" . $hash{$key} . "\n";
}
我们得到:
a:2
b:3
c:6
d:4
e:5
f:1
我希望这对您有所帮助。您指的是哪种“自动生成的值”?就像你用
$counter++
得到的数字一样?@ASCIIThenANSI是的,只是一个简单的$counter++随着每行的增加而增加。这个$counter
也应该是我散列中用字母表示的键的值:key->a,value->1,key->b,value->2
。哦,这是个棘手的问题。谢谢你的回答,第一个解决方案解决了我的问题。这个解决方案看起来很棒,谢谢你的回答。@MagomedSegaIsmailov没问题!很高兴为您提供帮助。这是解决我问题的众多解决方案之一,谢谢您的回答,我将保留它以备将来遇到的问题和任务使用!
f
a
b
d
e
c
a:2
b:3
c:6
d:4
e:5
f:1