arrays - 迭代数据数组/哈希

标签 arrays perl hash

我希望迭代这些数据结构(基本上是目录结构),我传递给定的路径。

目标是列出根/基本路径,然后列出所有子路径(如果存在),并且对于存在的每个子路径,列出file 来自该子路径。

我知道这可能需要循环 HoH 或 AoH。有人可以向我展示执行此操作的 perl 技术吗?谢谢。

基础级别:/work/eng/feeds

 $VAR1 = {
              'recursive' => 'no',
              'version' => '0.20.202.1.1101050227',
              'time' => '2011-10-26T00:20:18+0000',
              'filter' => '.*',
              'path' => '/work/eng/feeds',
              'directory' => [
                             {
                               'owner' => 'tst_act',
                               'group' => 'eng',
                               'permission' => 'drwxrwxr-x',
                               'path' => '/work/eng/feeds',
                               'accesstime' => '1970-01-01T00:00:00+0000',
                               'modified' => '2011-08-27T03:13:53+0000'
                             },
                             {
                               'owner' => 'tst_act',
                               'group' => 'eng',
                               'permission' => 'drwxr-xr-x',
                               'path' => '/work/eng/feeds/customer_care',
                               'accesstime' => '1970-01-01T00:00:00+0000',
                               'modified' => '2011-10-25T23:54:17+0000'
                             }
                           ],
              'exclude' => ''
            };

下一级别:/work/eng/feeds/customer_care

$VAR1 = {
          'recursive' => 'no',
          'version' => '0.20.202.1.1101050227',
          'time' => '2011-10-26T00:21:06+0000',
          'filter' => '.*',
          'path' => '/work/eng/feeds/customer_care',
          'directory' => [
                         {
                           'owner' => 'tst_act',
                           'group' => 'eng',
                           'permission' => 'drwxr-xr-x',
                           'path' => '/work/eng/feeds/customer_care',
                           'accesstime' => '1970-01-01T00:00:00+0000',
                           'modified' => '2011-10-25T23:54:17+0000'
                         },
                         {
                           'owner' => 'tst_act',
                           'group' => 'eng',
                           'permission' => 'drwx------',
                           'path' => '/work/eng/feeds/customer_care/abc',
                           'accesstime' => '1970-01-01T00:00:00+0000',
                           'modified' => '2011-10-25T17:12:56+0000'
                         },
                         {
                           'owner' => 'tst_act',
                           'group' => 'eng',
                           'permission' => 'drwx------',
                           'path' => '/work/eng/feeds/customer_care/def',
                           'accesstime' => '1970-01-01T00:00:00+0000',
                           'modified' => '2011-10-25T21:05:50+0000'
                         },
                         {
                           'owner' => 'tst_act',
                           'group' => 'eng',
                           'permission' => 'drwx------',
                           'path' => '/work/eng/feeds/customer_care/test',
                           'accesstime' => '1970-01-01T00:00:00+0000',
                           'modified' => '2011-10-25T21:28:14+0000'
                         }
                       ],
          'exclude' => ''
        };

还有一个级别:/work/eng/feeds/customer_care/test(此处存在一个文件)

$VAR1 = {
          'recursive' => 'no',
          'version' => '0.20.202.1.1101050227',
          'time' => '2011-10-26T00:30:02+0000',
          'filter' => '.*',
          'file' => {
                    'owner' => 'tst_act',
                    'replication' => '3',
                    'blocksize' => '134217728',
                    'permission' => '-rw-------',
                    'path' => '/work/eng/feeds/customer_care/test/q_data_20111023.dat',
                    'modified' => '2011-10-26T00:29:46+0000',
                    'size' => '379085',
                    'group' => 'eng',
                    'accesstime' => '2011-10-26T00:29:46+0000'
                  },
          'path' => '/work/eng/feeds/customer_care/test',
          'directory' => {
                         'owner' => 'tst_act',
                         'group' => 'eng',
                         'permission' => 'drwx------',
                         'path' => '/work/eng/feeds/customer_care/test',
                         'accesstime' => '1970-01-01T00:00:00+0000',
                         'modified' => '2011-10-26T00:29:46+0000'
                       },
          'exclude' => ''
        };

最佳答案

这是一个开胃菜:

sub list_path_files {
    my ($data) = @_;

    say $data->{path}; # get value from a hashref

    my @directories;
    # check whether it is a single value or an arrayref of values
    if (ref $data->{directory} eq 'ARRAY') {
        @directories = @{ $data->{directory} }; # dereference the arrayref to get an AoH
    } else {
        @directories = $data->{directory}; # just get the single value
    }

    for my $dir (@directories) {
        next if $dir->{path} eq $data->{path};
        say $dir->{path};
    }

    # I'll leave the rest for you to do
}

更新:

要迭代 hashref,您首先需要取消引用它,然后使用 eachkeysvalues 函数:

%hash = %$VAR1; # dereference

while (my ($key, $value) = each %hash) {...}

for my $key (keys %$VAR1) {
    my $value = $VAR1->{$key};
}

for my $value (values %$VAR1) {...}

如果哈希值是嵌套结构,您还需要取消引用它:

if (ref $val eq '') {
    # $val is just a scalar - don't need to deref
}
elsif (ref $val eq 'HASH') {
    my %hash = %$val;
}
elsif (ref $val eq 'ARRAY') {
    my @array = @$val;
}

关于arrays - 迭代数据数组/哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7897669/

相关文章:

php - 如何在PHP中按最大相同值对数组进行排序

C 在动态二维字符数组中插入字符串或(char*),段错误

Perl Facebook::Graph API v2.x

math - 如何为两个可互换的整数创建唯一键?

带有字符数组 : "warning: array subscript has type ' char'"的 C 警告

c++ - 建议一个合适的算法来合并两个包含类对象的数组(不重复)

perl - 如何使用 PDF::API2::Lite 添加带有图像的页眉、页脚?

regex - Perl 包含匹配变量的替换字符串的安全插值

java - 搜索哈希表

c++ - 如何将 std::hash 专门化为来自其他库的类型