Arrays 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) {

我正在努力理解Perl中哈希背后的逻辑。任务是将文件加载到哈希中,并将值分配给使用此文件创建的键

文件包含字母表,每个字母在其自己的行上:

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