Perl 填充并列出一对多散列数据结构

Perl 填充并列出一对多散列数据结构,perl,hash,Perl,Hash,下面的脚本列出了解析配置文件中的所有作业,并仅取出 运行作业的可执行文件-perl或shell脚本。然后它打开 可执行文件,并逐行遍历它并取出它读取的文件路径 以及它输出的路径 #!/usr/bin/perl use strict; use warnings; open my $fh_rmancfg, '<', "/data/autosys-us.cfg" or die "can't open file $!" ; while ( my $cfg_line = <$fh_rm

下面的脚本列出了解析配置文件中的所有作业,并仅取出 运行作业的可执行文件-perl或shell脚本。然后它打开 可执行文件,并逐行遍历它并取出它读取的文件路径 以及它输出的路径

#!/usr/bin/perl
use strict;
use warnings;
open my $fh_rmancfg, '<', "/data/autosys-us.cfg"
    or die "can't open file $!" ;
while ( my $cfg_line = <$fh_rmancfg>) {
    if ($cfg_line =~ /executable/) {
        my $cut_cfg_line = substr "$cfg_line", 13 ;
        if ($cut_cfg_line =~ /(\/\S*\.(sh|pl|ksh))/) {
            chomp($cut_cfg_line);
            open my $fh_cut_cfg, '<', $cut_cfg_line
                or warn qq{Can't open file "$cut_cfg_line" : $! } ;
            while (my $path = <$fh_cut_cfg>) {
                if ($path =~ /(\"\/\S*)\"/) {
                    print "$cut_cfg_line --->  $path";
                }
            }
        }
    }
}
我需要一个可以输入唯一密钥的数据结构 但它有很多价值。我想弄清楚这是什么 结构是,以及如何将值获取到结构中

program_1  -->  filepath_one
           -->  filepath_two
           -->  filepath_three
program_2  -->  filepath_one
           -->  filepath_two
           -->  filepath_three
           -->  filepath_four
program_3  -->  filepath_one
program_4  -->  filepath_one
           -->  filepath_one
           -->  filepath_two
program_5  -->  filepath_one
           -->  filepath_two
           -->  filepath_thee
           -->  filepath_four
           -->  filepath_five
           -->  filepath_six
           -->  filepath_seven
           -->  filepath_eight

如果要使用重复的键,则需要使用数组哈希。您可以在中阅读有关不同数据结构的更多信息

下面是一个简单的例子:

#!/usr/bin/perl
use strict;
use warnings;

my %hashofArrays;

while (<DATA>) {
    my ( $key, $value ) = split;
    push @{ $hashofArrays{ $key } }, $value;
}

use Data::Dumper;

print Dumper \%hashofArrays;

__DATA__
program_1 filepath_one
program_1 filepath_two
program_1 filepath_three
program_2 filepath_one
program_2 filepath_two
program_2 filepath_three
program_2 filepath_four
program_3 filepath_one
program_4 filepath_one
program_4 filepath_one
program_4 filepath_two
program_5 filepath_one
program_5 filepath_two
program_5 filepath_thee
program_5 filepath_four
program_5 filepath_five
program_5 filepath_six
program_5 filepath_seven
program_5 filepath_eight

正如你所发现的,当你做这样的事情时:

$hash{key} = "value";
$hash{key} = "new value";
原来的价值消失了。幸运的是,Perl5允许您使用。Perl引用允许您将散列键指向值数组而不是单个值

$hash{key} = [];   # The value is a reference to an array
$hash{key}->[0] = "value";
$hash{key}->[1] = "new value";
现在,$hash{key}包含两个值!该数组称为引用,有时甚至称为匿名数组,因为数组本身没有与其关联的变量名

可以通过在变量前面加反斜杠来创建引用:

$array\u reference=\@array

要取消引用,即将引用转回到数组中,请将正确的

my@new_array=@{$array_reference}

使用引用允许Perl使用更复杂的数据结构。您可以使用push将值推送到特定哈希值指向的数组引用中,而不是简单地将值分配给哈希:

my %hash;
$hash{key} = [];          # This key is an array reference
for each $value ( qw(value1 value2 value3 ) ) {
    push @{ $hash{key} }, $value;
}

阅读,它会让您了解如何使用数组散列来存储所有值。

使用数组散列,其中键是program_x,数组是文件路径。一旦您熟悉了引用的概念,就可以删除初始的$hash{key}=[];只需推送{$hash{key}},$value;感谢的魔力。我喜欢$hash{key}=[];行,因为它记录了我期望的数组引用。但大多数人并不这么认为。
$hash{key} = [];   # The value is a reference to an array
$hash{key}->[0] = "value";
$hash{key}->[1] = "new value";
my %hash;
$hash{key} = [];          # This key is an array reference
for each $value ( qw(value1 value2 value3 ) ) {
    push @{ $hash{key} }, $value;
}