如何修改Perl的print_dir子程序调用print_file打印目录内文件内容
问题根因
你编写的print_dir子程序存在逻辑错误,是代码无输出也无报错的核心原因:
- 你通过第一行
my $dir = shift;已经取出了传入的第一个目录参数,生成了该目录下的文件列表@files - 后续新增的
while (my $dir = shift)循环是多余逻辑:如果只传入1个目录参数,第二次执行shift会返回空值,循环直接不运行,自然不会调用print_file输出任何内容;如果传入多个目录参数,循环内也完全没有用到新取出的$dir变量,永远只会处理第一个目录的文件。
修复后的代码
直接删除多余的while循环即可,单目录处理版本:
#!/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/*"; foreach my $file (@files) { # 可选优化:判断是普通文件再处理,避免打开子目录报错 next unless -f $file; print_file $file; } } print_dir @ARGV;
如果需要支持传入多个目录批量处理,可以调整print_dir逻辑如下:
sub print_dir { # 遍历所有传入的目录参数 foreach my $dir (@_) { my @files = glob "$dir/*"; foreach my $file (@files) { next unless -f $file; print_file $file; } } }
内容的提问来源于stack exchange,提问作者Alexandra
相关产品推荐
相关产品推荐

