這是你的代碼的快速(和最小)重寫,這可能有助於:
use strict;
use warnings;
my $te_dir = "/projects/xxx/";
opendir(my $dirh, $te_dir) or die "Could not open '$te_dir': $!";
while (my $file = readdir($dirh)) {
next unless $file =~ /\.txt$/;
#// Doing some tasks.
if ($file =~ /^ lin \d* \.txt $/x) {
my $linfile = "$te_dir/$file";
open(my $fh, $linfile) or die "Couldn't open file $linfile: $!";
while (my $line = <$fh>) {
print $line;
}
close $fh or die "Could not close $linfile: $!";
}
}
首先,請注意,我們已經把strict
和warnings
在代碼的頂部。這會告訴你各種有趣的問題,包括拼寫錯誤的變量名稱。
接下來,我們切換到詞法句柄(例如,my $dirh
而不是DIR
)。您正在使用的手柄的「裸號」版本(DIR
和LINFILE
)長期以來一直受到阻礙,因爲這些手柄實際上是全球性構造,而且通常全球數據不好,因爲當它被破壞時,很難分辨出它是什麼,所以我們非常非常喜歡的詞彙版本(與my
內置宣佈手柄)
而且,這條線,你可能有不這樣做,你在想什麼:
$linfile=$te_dir/$file;
你試圖用正斜槓將目錄和文件名一起粉碎,但由於您沒有使用字符串插值,所以實際上使用的是師。在這個數字上下文中,您的導演和文件名都可能評估爲零,當您嘗試打開文件時,會給您一個零除錯誤!
但是,如果你願意使用CPAN模塊,您可以更輕鬆地進行:
use strict;
use warnings;
use File::Find::Rule;
my $te_dir = "/projects/xxx/";
my @files = File::Find::Rule->file->name('lin*.txt')->in($te_dir);
foreach my $linfile (@files) {
#// Doing some tasks.
open my $fh, $linfile or die "Couldn't open file $linfile: $!";
while (my $line = <$fh>) {
print $line;
}
}
沒有搞亂,沒什麼大驚小怪的。在第一遍中只獲取想要的文件,並且已經具有正確的文件名(注意,我沒有關閉文件句柄,因爲$fh
在foreach
循環結束時超出範圍時會自動關閉。)
'$ te_dir/$ file'周圍還有(雙)引號,但這也可能是一個轉錄問題。 –