将文本文件读入散列并访问值perl

20jt8wwn  于 2023-02-09  发布在  Perl
关注(0)|答案(2)|浏览(144)

我试图将文本文件内容读入哈希,但阅读和访问它时遇到一些问题。

resctrl_top
    /path/to/a/
vdm05top
    /path/to/b/
    /path/to/c/
    /path/to/d/
    /path/to/e/
    /path/to/f/

文件格式将如上所述。我想要的输出是一个散列与非空格线作为关键字,和路径线作为值。我还想知道如何访问不同的关键字每个值。

resctrl_top => /path/to/a/
vdm05top => /path/to/b/,/path/to/c/,...

下面是我尝试的努力:

use strict;
use warnings;
my %hash;
open FILE, "filename.txt" or die $!;
my $key;
while (my $line = <FILE>) {
     chomp($line);
     if ($line !~ /^\s/) {
        ($key) = $line =~ /^\S+/g;
        $hash{$key} = [];
     } else {
        $line =~ s/^\s+//;
        push @{ $hash{$key} }, $line;
     }
 }
 close FILE;

 foreach (keys %hash){
    print "$key => $hash{$key}\n";
 }
rjee0c15

rjee0c151#

请尝试以下方法:

use strict;
use warnings;
use Data::Dumper;
my %hash;
my $key;
while (my $line = <DATA>) {
     chomp($line);
     if ($line !~ /^\s/) {
        $key = $line;
     } else {
        $line =~ s/\s//g;
        push (@{$hash{$key}} , $line);
     }
}
my %final;
foreach my $k (keys %hash){
        my $val = join(",", @{$hash{$k}});
        $final{$k} = $val; #New hash will have key and respective values
}

print Dumper(\%final);

__DATA__
resctrl_top
    /path/to/a/
vdm05top
    /path/to/b/
    /path/to/c/
    /path/to/d/
    /path/to/e/
    /path/to/f/

结果:

$VAR1 = {
          'vdm05top' => '/path/to/b/,/path/to/c/,/path/to/d/,/path/to/e/,/path/to/f/',
          'resctrl_top' => '/path/to/a/'
        };

希望这能解决你的问题。

z5btuh9x

z5btuh9x2#

这里有一个非常简单的解决方案。

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

use Data::Dumper; # Just for output

my ($key, %hash); # Declare globals

while (<DATA>) {  # Quick hack - read from DATA
  chomp;

  if (/^\s/) {    # If the line starts with a space
    s/^\s+//;
    push @{$hash{$key}}, $_;
  } else {        # The line is a key
    $key = $_;
  }
}

say Dumper \%hash;

__DATA__
resctrl_top
    /path/to/a/
vdm05top
    /path/to/b/
    /path/to/c/
    /path/to/d/
    /path/to/e/
    /path/to/f/

相关问题