2011-09-23 3 views
3

디렉토리 이름을 키로 사용하는 Perl에서 어떻게 해시를 생성 한 다음 디렉토리의 파일 수와 각 파일의 이름을 모두 저장합니까? 배열의 해시 또는 해시 해시를 사용할 수 있습니까?Perl에서 해시 만들기

나는 모든 조언을 고맙게 생각합니다.

답변

2

정확하게 이해하면이 작업이 트릭 (마지막에 덤퍼()를 사용하여 해시의 인쇄는 hashref에 포함 된 내용을 보여 그냥) :

#!/usr/bin/perl -w 

use strict; 
use Data::Dumper; 

my $dir = $ENV{PWD}; 
opendir(DIR, $dir) or die $!; 
my @files = grep { -f "$dir/$_" } readdir(DIR); 
my $hash = { 
    $dir => { 
     count => scalar(@files), 
     files => \@files, 
    } 
}; 

print Dumper($hash), "\n"; 
+0

이 접근 방법은 어떻습니까? 해시에 관해서 Perl을 처음 접했습니다. while (my $ line = ) { my ($ filename, $ dir) = fileparse ($ line); $ data _ {$ dir} {file} = $ filename; $ 데이터 _ {$ dir} {count} ++; } – farhany

+0

직접 경로 붙이기 대신 File :: Spec (또는 그에 기반하여 작성된 것)을 사용하십시오. –

4

해시 값은 스칼라 여야하므로 실제 질문은 두 값을 하나의 스칼라로 가져 오는 방법입니다. 참조는 스칼라이므로 해시에 대한 참조가 작동합니다.

$data{$dir} = { 
    file_count => [email protected], 
    files  => \@files, 
}; 

파일 개수가 중복됩니다. 파일 수에 [email protected]{ $data{$dir}{files} }을 사용할 수 있습니다. 이 중복 제거하도록 선택하면 파일 수가

[email protected]{ $files{$dir} } 

로 사용할 수 있습니다

$files{$dir} = \@files; 

사용할 수 있고 파일이

@{ $files{$dir} } 

합니다 (0+로 사용할 수 있습니다 스칼라 컨텍스트에서 생략하십시오.)

+5

제 생각에 'scalar @ files'는'0 + @ files'보다 읽기 쉽습니다. –

+0

@Alan Haggai Alavi, 당신이 처음 들었습니다. 많은 사람들이 저에게 말했습니다. 대부분 숫자가 반환된다는 것을 나타 내기 때문에 누적 연산자 ('0 +')가 훨씬 명확하다고 생각합니다. 나는 목록에 추가가 있다고 생각하는 사람을 불쌍히 여긴다. – ikegami

+0

@Alan Haggai Alavi,'' "."는. 자열 연산자이며,'0 +'는 숫자 연산자이고,'!!'는 부울 화 연산자입니다. '스칼라'가 아닌 이들 중 하나를 사용해야 할 때가 있습니다. 그 시간은 여러분이 사용할 수없는 시간보다 더 많으며'스칼라 '를 사용해야하므로 시간이 많이 걸리므로 익숙해 지시기 바랍니다. 당신은 친숙하지 않은 가독성 부족을 혼란스럽게 보입니다. – ikegami

2

개인적으로 거의 항상 내가 너무 해시 참조 대신 대신 펄 해시 (및 arrayrefs 펄 배열을 사용하여). 예 :

my $dirs = { 
    '/home/user' => [ '.profile', '.bashrc', 'My_pic.png' ], 
    '/root'  => [ '.profile', '.zshrc' ] 
}; 

my $var = { (...) } 해시 참조하여

, => 쉼표 , 단지 동의어이지만 해시 키와 값을 구별 허용한다. [ (...) ]은 해시 값으로 할당 된 익명의 배열 참조를 만듭니다.

당신은 파일의 번호와 같은 중복 된 정보를 저장하지 않아도, 당신은 단지 스칼라 문맥에서 배열을 평가할 수 :

my $root_files = $dirs->{'/root'}; 
$size = scalar @{$root_files}; 

할 수 있습니다 read more about hashes herehere.

관련 문제