【问题标题】:Perl Hash + While add elementsPerl Hash + While 添加元素
【发布时间】:2012-09-03 01:20:26
【问题描述】:

我需要将每个元素存储在文件中键和值的权限的第一列中,我这样做了,但我不明白。

这是我的文件“文件特权”中的内容

-rw-rw-r--. file-privilege
-rw-rw-r--. file-selinux
-rwxrwxrwx. funcion-split-join.pl
-rwxrwxr-x. hash2.pl
-rw-rw-r--. hash3.pl
-rwxrwxr-x. hash.pl
-rwxrwxr-x. inthashfile.pl
-rw-rw-r--. ls
-rwx------. probando.pl

perl 中的代码。

%pr_file = ();
open(WHO, "file-privilege");
while (<WHO>) {
    ($privilege, $file) = split ;
    push( @{$pr_file{$privilege}}, $file );
}

这个输出。

-rwx------. = ARRAY(0x83bb7f0)
-rw-rw-r--. = ARRAY(0x83a06f8)
-rwxrwxr-x. = ARRAY(0x83bb780)
-rwxrwxrwx. = ARRAY(0x83bb750)

我需要:

键=值

-rw-rw-r--. = file-privilege

等等……

有什么想法吗?

【问题讨论】:

    标签: perl


    【解决方案1】:

    同一个键映射到多个值。您需要像添加值一样取消引用数组引用;或使用只记住最后一个(或第一个,或随机)值的标量。

    无论如何,您向我们展示的代码是正确的;问题出在打印出您未提供的值的代码中。但是像这样:

    for my $priv (keys %pr_file) {
        for my $file (@{$pr_file{$priv}}) {
            print "$priv => $file"; # Already contains trailing newline
        }
    }
    

    顺便说一句,您可能应该使用 Perl 的内置 stat() 函数,而不是尝试解析 ls 输出。

    【讨论】:

    • sub noc {foreach $user (排序键 %pr_file) { print "$user @{$pr_file{$user}}\n"; }} 无
    【解决方案2】:

    没有看到代码,你可能在做:

    print "$privilege = $pr_file{$privilege}\n";
    

    由于您将文件名列表存储在数组引用$pr_file{$privilege} 中,因此此代码通过打印“ARRAY(address)”使用数组引用的默认字符串化。

    当您打印结果时,您需要自己以更有用的格式将文件名的数组引用字符串化:

    print "$privilege = $pr_file{$privilege}->[0]\n"; # Print the first file in the list
    
    print "$privilege = $pr_file{$privilege}->[-1]\n"; # Print the last file in the list
    
    my $files_string = join(",", @{ $pr_file{$privilege} })); #Comma separated files
    print "$privilege = $files_string\n"; # Print all files, comma separated
    
    my @files = @{ $pr_file{$privilege} }); # Dereference the array ref into array
    print "$privilege = @files\n"; # Print all files, space separated. 
                                   # Uses default stringification of an array
    

    【讨论】:

    • 你甚至可以直接做print "$privilege = @{ $pr_file{$privilege} }";
    猜你喜欢
    • 2012-04-19
    • 2015-06-06
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 2020-09-12
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多