【问题标题】:Perl - create and automate a hash table with arrays as the valuesPerl - 创建和自动化一个以数组为值的哈希表
【发布时间】:2016-01-25 06:25:25
【问题描述】:

我正在努力实现以下目标:

我有一个包含随机文件列表的 txt 文件, 我想按文件的路径对文件进行排序。

例如: 名单是:

c:\foo\bar\bbb.txt
c:\foo\bar\ccc.txt
d:\xxx\eee.txt
c:\foo\bar\aaa.txt
d:\xxx\ddd.txt

我想要这样的数据:

[KEY]
c:\foo\bar
[Values]
aaa.txt
bbb.txt
ccc.txt

[KEY]
d:\xxx\
[Values]
ddd.txt
eee.txt

我想到了使用哈希映射,将数组作为值。 我想不出正确的语法。

这是我的一些代码:

open (FILELIST, "$file") or ...;
my @filelist = <FILELIST>;
my %uniqueFolders;
    foreach $fileList_line (@filelist)
      {
         my $file = (File::Spec::Win32->splitpath($fileList_file))[1];
           if ( !$file ~~ @temp = keys %uniqueFolders)
             {
                 %uniqueFolders{$file} = ????????????

              }

如何访问数组以添加/读取?

以及如何实现自动化,以便在需要时创建数组..

帮助,

谢谢。

【问题讨论】:

    标签: arrays perl hashmap hashtable key-value


    【解决方案1】:

    你走上了一条死胡同。你不需要创建数组,因为 perl 有一个叫做 autovivification 的特性。

    通过在散列中写入数组,它是自动创建的。

    所以你的任务很简单:

    push ( @{ $uniqueFolders{$key}}, $value) ;
    

    拆分你的文件名,这样你就有一个键和值。 File::Spec 和 splitpath 是正确的方法。

    读取就像在哈希上使用“键”一样简单。

    例如

    foreach my $path ( keys %uniqueFolders ) {
        print "[KEY]\n";
        print "$path\n"; 
        print "[Values]\n";
        print join ( "\n", @{$uniqueFolders{$path}} ),"\n"
    }
    

    【讨论】:

      【解决方案2】:

      你可以简化你的算法,

      use strict;
      use warnings;
      
      use File::Basename;
      
      local @ARGV = "list_of_files.txt";
      my %seen;
      for (sort <>) {
        my $d = dirname($_);
        $seen{$d}++ or print qq(\n[KEY]\n$d\n[Values]\n);
        print basename($_);
      }
      

      输出

      [KEY]
      c:\foo\bar
      [Values]
      aaa.txt
      bbb.txt
      ccc.txt
      
      [KEY]
      d:\xxx
      [Values]
      ddd.txt
      eee.txt
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-08
        • 1970-01-01
        • 2011-04-20
        • 2013-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-26
        相关资源
        最近更新 更多