閱讀Allen B. Downey的《艱難的學習 Perl》。
練習 1.1 說:
glob 運算子將模式作為引數并回傳與給定模式匹配的所有檔案的串列。glob 的一個常見用途是列出目錄中的檔案。
my @files = glob "$dir/*";該模式的
$dir/*意思是“目錄中名稱存盤在 中的所有檔案$dir”。有關其他模式的示例,請參閱 glob 的檔案。撰寫一個名為 print dir 的子例程,它將目錄名稱作為引數并列印該目錄中的檔案,每行一個。
我是這樣做的:
#!/usr/bin/perl
sub print_dir {
my $dir = shift;
my @files = glob "$dir/*";
foreach my $file (@files) {
print "$file\n";
}
}
print_dir @ARGV;
然后練習 1.2 說“修改前面的子程式,以便它使用 print_file 列印檔案的內容而不是列印檔案的名稱。”
我正在努力解決這個問題。我有一個列印檔案內容的腳本:
#!/usr/bin/perl
use strict;
use warnings;
sub print_file {
my $file = shift;
open(my $FILE, $file)
or die $!;
while (my $line = <$FILE>) {
print $line;
}
}
sub cat {
foreach my $file (@_) {
print_file $file;
}
}
cat @ARGV;
然后我有上面的另一個腳本,用于列印目錄中所有檔案的名稱。所以這就是我到目前為止嘗試獲取目錄中的所有檔案,然后列印所有這些檔案的內容:
#!/usr/bin/perl
use strict;
use warnings;
sub print_file {
my $file = shift;
open(my $FILE, $file)
or die $!;
while (my $line = <$FILE>) {
print $line;
}
}
sub print_dir {
my $dir = shift;
my @files = glob "$dir/*";
while (my $dir = shift) {
foreach my $file (@files) {
print_file "$file";
}
}
}
print_dir @ARGV;
顯然它不起作用,也沒有錯誤訊息。
uj5u.com熱心網友回復:
您無緣無故地向檔案名添加換行符。
print_file "$file\n";
應該
print_file $file;
順便說一句,無用地使用全域變數(如FILE)是一種不好的做法。檢查open錯誤是個好主意,因為它很容易出現錯誤。
open my $FILE, $file
or die "Can't open \"$file\": $!\n";
while (my $line = <$FILE>) {
...
}
對于您的錯誤,這將輸出類似
Can't open "./some_file
": No such file or directory
uj5u.com熱心網友回復:
以下代碼片段展示了您練習的兩種可能解決方案。
Perl 代碼可以非常簡潔地表達所需的演算法(原則:簡潔是智慧的靈魂)。
注 1:代碼驗證傳遞的引數是一個目錄
注 2:代碼跳過目錄內容的輸出,因為它不是檔案
use strict;
use warnings;
use feature 'say';
print_dir($_) for @ARGV;
sub print_dir {
my $dir = shift;
die "$dir isn't a directory" unless -d $dir;
say for glob("$dir/*");
}
修改代碼以列印檔案的內容
use strict;
use warnings;
use feature 'say';
print_dir($_) for @ARGV;
sub print_dir {
my $dir = shift;
die "$dir isn't a directory" unless -d $dir;
for my $fname ( glob("$dir/*") ) {
next if -d $fname; # skip directories
say "\n" . '-' x 25
. "\n" . $fname
. "\n" . '-' x 25;
open my $fh, '<', $fname
or die "Couldn't open $fname";
print while <$fh>;
close $fh;
}
}
參考:
- -X 檔案測驗
- 球體
- 打開
- 死
- 說
- 帕爾瓦
- 教程:Perl 檔案測驗運算子
- 教程:Perl 特殊變數
推薦:
- 學習 Perl
- Perl 檔案
- Perl 庫
- 免費 Perl 書籍
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/368291.html
