1

キーの権限とファイルの値がある最初の列に各要素を保存する必要があります。これを実行しましたが、わかりません。

それは私のファイル「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)

私は欲しい:

キー=値

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

等...

何か案が?

4

2 に答える 2

3

同じキーが複数の値にマップされます。値を追加するときと同じように、配列参照を逆参照する必要があります。または、最後の(または最初の、またはランダムな)値のみを記憶するスカラーを使用します。

とにかく、あなたが私たちに示したコードは正しいです。問題は、指定していない値を出力するコードにあります。しかし、このようなもの:

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

byまでに、出力stat()を解析しようとするのではなく、おそらくPerlの組み込み関数を使用する必要がありlsます。

于 2012-09-02T16:30:29.310 に答える
2

コードを見ずに、おそらく次のことを行っています。

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

ファイル名のリストを配列参照に格納しているため、このコードは「ARRAY(address)」を出力することにより、配列参照$pr_file{$privilege}のデフォルトの文字列化を使用します。

結果を出力するときは、ファイル名の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
于 2012-09-02T16:34:32.450 に答える