2012-09-02 3 views
1

첫 번째 열에 각 요소를 파일의 키와 값의 권한이있는 곳에 저장해야하지만이 작업을 수행했지만 이해가되지 않습니다.Perl 해시 + 요소 추가 중

는 "파일 권한"펄

-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 

코드 내 파일의 내용입니다.

%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 

등 ...

어떤 생각?

답변

3

동일한 키가 여러 값에 매핑됩니다. 값을 추가 할 때처럼 배열 참조를 역 참조 할 필요가 있습니다. 또는 마지막 (또는 첫 번째 또는 임의의) 값만 기억하는 스칼라를 사용하십시오.

어쨌든, 우리에게 보여준 코드는 정확합니다. 문제는 제공하지 않은 값을 출력하는 코드에 있습니다. 그러나이 같은 :

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

바이함으로써, 당신은 아마 사용해야 펄에 내장 된 stat() 기능보다는 ls 출력을 구문 분석하려고합니다.

+0

서브 NOC {foreach는 $ 사용자 (정렬 키 %의 pr_file) { 인쇄 "$ : 당신이 결과를 인쇄 할 때

, 당신은 더 유용한 형식으로 자신을 당신에게 파일 이름의 arrayref 캐릭터 라인 화 필요 user @ {$ pr_file {$ user}} \ n "; }} noc – opmeitle

2

코드를 보지 않고, 당신은 아마하고 있습니다 :

당신이 배열 참조 $pr_file{$privilege}에 파일 이름의 목록을 저장하고 있기 때문에
print "$privilege = $pr_file{$privilege}\n"; 

는이 코드를 인쇄함으로써, 배열 참조의 기본 문자열 화 (stringification)를 사용합니다 " ARRAY (주소) ".

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 
+0

'print "$ privilege = @ {$ pr_file {$ privilege}}";를 직접 수행 할 수도 있습니다. –