2011-09-23 89 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很陌生。(my $ line = ){ my($ filename,$ dir)= fileparse($ line); $ data _ {$ dir} {file} = $ filename; $ data _ {$ dir} {count} ++; } – farhany

+0

而不是自己粘貼路徑,使用File :: Spec(或建立在它上面的東西)。 –

4

哈希值必須是標量,所以真正的問題是如何將兩個值合併爲一個標量。引用是標量,所以引用散列會起作用。

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

請注意,文件數量是多餘的。 [email protected]{ $data{$dir}{files} }可用於文件計數。如果您選擇擺脫這種冗餘,可以使用

$files{$dir} = \@files; 

的文件數可作爲

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

和文件是作爲

@{ $files{$dir} } 

(該0+能在標量上下文中省略)。

+5

在我看來,'scalar @ files'比'0 + @ files'更具可讀性。 –

+0

@Alan Haggai Alavi,你是我聽到的第一個這樣說的人,很多人告訴我相反。大多數人認爲數字化操作符('0 +')更清晰,因爲它表示一個數字將被返回。我可惜認爲加法在名單上工作的人。 – ikegami

+0

@Alan Haggai Alavi,'「」.'是一個字符串操作符,'0 +'是一個數字化操作符,'!!'是一個布爾化操作符。有些時候你必須使用其中的一種而不是'標量',這些時間比不能使用這些時間的時間更多,並且必須使用'標量',所以我建議你習慣它們。您似乎對缺乏可讀性和缺乏熟悉感感到困惑。 – ikegami

2

個人幾乎都是我用散列引用,而不是perl的哈希值(和arrayrefs而不是perl的陣列,也)。例如:

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

相關問題