這段程式碼很有意思,事實上我們常常在寫程式時創造一些可重複使用的架構,但是怎麼做會更靈活?
ps. 程式碼哉自Higer-Order Perl
這程式是一個 list 目錄-檔案的 遞迴程式,通常我們寫完了以後,會希望從這個結構擴充,而下面程
式碼中的 $code->($top); 正是可以由外部擴充邏輯的地方(callback)
sub dir_walk {
my ($top, $code) = @_;
my $DIR;
$code->($top);
if (-d $top) {
my $file;
unless (opendir $DIR, $top) {
warn "Couldn’t open directory $top: $!; skipping.\n";
return;
}
while ($file = readdir $DIR) {
next if $file eq '.' || $file eq '..';
dir_walk("$top/$file", $code);
}
}
}
sub print_dir {
print $_[0], "\n";
}
dir_walk('.', \&print_dir );
在這裡我們看到,程式原始的架構是list 目錄-檔案 , 但是我們可以傳給function 2個參數
1 起始路徑 2 function , 恩! 這看起來有濃濃的 functional 的味道,不是嗎?
ps. 程式碼哉自Higer-Order Perl
這程式是一個 list 目錄-檔案的 遞迴程式,通常我們寫完了以後,會希望從這個結構擴充,而下面程
式碼中的 $code->($top); 正是可以由外部擴充邏輯的地方(callback)
sub dir_walk {
my ($top, $code) = @_;
my $DIR;
$code->($top);
if (-d $top) {
my $file;
unless (opendir $DIR, $top) {
warn "Couldn’t open directory $top: $!; skipping.\n";
return;
}
while ($file = readdir $DIR) {
next if $file eq '.' || $file eq '..';
dir_walk("$top/$file", $code);
}
}
}
sub print_dir {
print $_[0], "\n";
}
dir_walk('.', \&print_dir );
在這裡我們看到,程式原始的架構是list 目錄-檔案 , 但是我們可以傳給function 2個參數
1 起始路徑 2 function , 恩! 這看起來有濃濃的 functional 的味道,不是嗎?
留言