1

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

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

-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

ETC...

任何想法?

4

2 回答 2

3

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

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

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

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

于 2012-09-02T16:30:29.310 回答
2

在没有看到代码的情况下,您可能正在执行以下操作:

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

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

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

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
于 2012-09-02T16:34:32.450 回答