我需要在第一列中存储每个元素,其中包含文件中的键和值的权限,我这样做但我不明白。
它的内容在我的文件“file-privilege”
中-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)
我需要:
key = value
-rw-rw-r--. = file-privilege
等...
任何想法?
答案 0 :(得分:3)
相同的键映射到多个值。您需要取消引用数组引用,就像添加值一样;或使用仅记住最后(或第一个或随机)值的标量。
无论如何,你向我们展示的代码是正确的;问题在于打印出您未提供的值的代码。但是这样的事情:
for my $priv (keys %pr_file) {
for my $file (@{$pr_file{$priv}}) {
print "$priv => $file"; # Already contains trailing newline
}
}
顺便说一句,您应该使用Perl的内置stat()
函数,而不是尝试解析ls
输出。
答案 1 :(得分:2)
没有看到代码,你可能正在做:
print "$privilege = $pr_file{$privilege}\n";
由于您要在数组引用$pr_file{$privilege}
中存储文件名列表,因此此代码使用数组引用的默认字符串化,方法是打印“ARRAY(地址)”。
当您打印结果时,您需要自己以更有用的格式将文件名的arrayref字符串化:
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