作者:冰忆ch | 来源:互联网 | 2022-12-10 04:12
1> zdim..:
该readdir
回报单纯的文件名,不带路径.
因此,当您继续打开这些文件时,您需要在此处添加返回readdir
的名称和readdir
读取它们的目录的名称$filepath
.或者立即建立完整的路径名称
use warnings;
use strict;
use feature 'say';
use File::Spec;
print "Enter the path: ";
my $filepath = ;
chomp $filepath;
die "\nPlease give input folder\n" if !defined $filepath or !-d $filepath;
opendir(my $fh_dir, $filepath) or die "Can't opendir $filepath: $!";
my @xml_files =
map { File::Spec->catfile($filepath, $_) }
grep { /\.xml$/ }
readdir $fh_dir;
closedir $fh_dir;
say for @xml_files;
我使用File :: Spec将文件名可拆分地拼凑在一起.
以下是对代码的一些评论.请注意,这通常在Code Review中完成,但我觉得这里需要它.
第一:预先声明一长串变量.事实上,在尽可能小的范围内声明是很重要的.事实证明,大多数变量确实可以在使用它们的地方声明,如下面的评论所示.
使用可以最好地找到可执行文件的位置
use FindBin qw($RealBin);
哪里$RealBin
也解析链接(相对于$Bin
,也可用)
()
在声明处分配给数组不会做任何事情; 它与正常情况完全一样my @errors;
.他们也可以一起去my (@errors, @warnings, @checks);
.如果数组有东西然后= ()
清除它,什么是清空数组的好方法
分配a "0"
使变量成为字符串.虽然Perl通常根据需要在字符串和数字之间进行转换,但如果需要数字则使用数字,my $z = 0;
词法文件句柄(open my $fh, ...
)比globs(open FH, ...
)更好
我不理解排序中关于" 数字错误 " 的评论.该cmp
运营商的字典顺序,对数字排序使用<=>
当在标量上下文中使用数组时 - 例如,当分配给标量时 - 返回元素的数量.所以不需要,scalar
但做my flcnt = @xmlF;
对于数组索引的迭代,使用for $#ary
的最后一个元素的索引@ary
foreach my $i (0..$#xmlF) { ... }
但是,如果没有任何索引的使用(我没有看到任何),那么循环元素
foreach my $file (@xmlF) { ... }
检查文件时open
打印错误 $!,open ... or die "... : $!";
.这是在代码的其他地方完成的,应该始终这样做.
在local $/;
取消设置的输入记录分隔符,是什么让下面的读取整个文件.如果这是打算,那么$line
这不是一个好名字.另请注意,变量可以在条件内声明,while (my $line = <$fh>) { }
我不能评论正则表达式,因为我不知道它应该完成什么,但它很复杂; 有什么机会简化这一切吗?
一系列foreach
循环只能计算出那些数组的元素数量; 那么就不需要循环,只需my $ecount = @errors;
(等).这也允许您将这些计数器变量的声明保持在最小范围内.
该undef @errors;
(等)是不需要的,因为这些数组数为每个文件,所以你可以声明它们的环内,在最小的范围内.另请注意,如果要清空数组,最好@ary = ();
再进行操作undef
.