디렉토리 이름을 키로 사용하는 Perl에서 어떻게 해시를 생성 한 다음 디렉토리의 파일 수와 각 파일의 이름을 모두 저장합니까? 배열의 해시 또는 해시 해시를 사용할 수 있습니까?Perl에서 해시 만들기
나는 모든 조언을 고맙게 생각합니다.
디렉토리 이름을 키로 사용하는 Perl에서 어떻게 해시를 생성 한 다음 디렉토리의 파일 수와 각 파일의 이름을 모두 저장합니까? 배열의 해시 또는 해시 해시를 사용할 수 있습니까?Perl에서 해시 만들기
나는 모든 조언을 고맙게 생각합니다.
정확하게 이해하면이 작업이 트릭 (마지막에 덤퍼()를 사용하여 해시의 인쇄는 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";
해시 값은 스칼라 여야하므로 실제 질문은 두 값을 하나의 스칼라로 가져 오는 방법입니다. 참조는 스칼라이므로 해시에 대한 참조가 작동합니다.
$data{$dir} = {
file_count => [email protected],
files => \@files,
};
파일 개수가 중복됩니다. 파일 수에 [email protected]{ $data{$dir}{files} }
을 사용할 수 있습니다. 이 중복 제거하도록 선택하면 파일 수가
[email protected]{ $files{$dir} }
로 사용할 수 있습니다
$files{$dir} = \@files;
사용할 수 있고 파일이
@{ $files{$dir} }
합니다 (0+
로 사용할 수 있습니다 스칼라 컨텍스트에서 생략하십시오.)
제 생각에 'scalar @ files'는'0 + @ files'보다 읽기 쉽습니다. –
@Alan Haggai Alavi, 당신이 처음 들었습니다. 많은 사람들이 저에게 말했습니다. 대부분 숫자가 반환된다는 것을 나타 내기 때문에 누적 연산자 ('0 +')가 훨씬 명확하다고 생각합니다. 나는 목록에 추가가 있다고 생각하는 사람을 불쌍히 여긴다. – ikegami
@Alan Haggai Alavi,'' "."는. 자열 연산자이며,'0 +'는 숫자 연산자이고,'!!'는 부울 화 연산자입니다. '스칼라'가 아닌 이들 중 하나를 사용해야 할 때가 있습니다. 그 시간은 여러분이 사용할 수없는 시간보다 더 많으며'스칼라 '를 사용해야하므로 시간이 많이 걸리므로 익숙해 지시기 바랍니다. 당신은 친숙하지 않은 가독성 부족을 혼란스럽게 보입니다. – ikegami
개인적으로 거의 항상 내가 너무 해시 참조 대신 대신 펄 해시 (및 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 here 및 here.
이 접근 방법은 어떻습니까? 해시에 관해서 Perl을 처음 접했습니다. while (my $ line =) { my ($ filename, $ dir) = fileparse ($ line); $ data _ {$ dir} {file} = $ filename; $ 데이터 _ {$ dir} {count} ++; } –
farhany
직접 경로 붙이기 대신 File :: Spec (또는 그에 기반하여 작성된 것)을 사용하십시오. –