关于文件计数的困惑

时间:2016-01-05 17:26:01

标签: perl

我见过很多关于使用Perl来计算目录中特定文件的帖子,其中一个显示了这段代码

@filesInDirectory = glob("$directory$fileNameRegex");
$numberOfFiles = @filesInDirectory;

然后如果我跟着这个:

print LOGFILE $#filesInDirectory;
print LOGFILE $numberOfFiles;

日志将有01.如果混淆是这样的:当我正在寻找的文件不存在时,为什么$ numberOfFiles 1而不是0?

3 个答案:

答案 0 :(得分:10)

$numberOfFiles包含元素@filesInDirectory的数量。由于@filesInDirectory包含一个元素,$numberOfFiles包含1

$#filesInDirectory包含@filesInDirectory中最后一个元素的索引。由于@filesInDirectory包含一个元素($filesInDirectory[0]),$numberOfFiles包含0

除非你弄乱$[(不要!!),否则$#a在标量语境中总是比@a少一个。

答案 1 :(得分:4)

Filename globs不是正则表达式,因此如果$fileNameRegex是其名称所暗示的,那么在这里使用它是错误的。

Globs是用于将文件名扩展为shell命令行的模式匹配语言:*匹配任何字符串(相当于正则表达式中的.*),?匹配单个字符(相当于正则表达式中的.),[]的工作方式与正则表达式完全相同。

如果您需要针对正则表达式测试文件名,则必须在从grep(或glob)返回的列表中执行readdir。< / p>

答案 2 :(得分:2)

如果您想知道为什么@filesInDirectory中有某些内容而不是空的,那么您已经拥有a solution

但是如果你问为什么$numberOfFiles$#filesInDirectory不同那么它是因为第一个包含@filesInDirectory中的元素数量,而第二个包含<{>}的索引@filesInDirectory

的最后一个元素

Perl索引从零开始,因此如果@array只有一个元素,则$#array将为零。如果@array为空,则$#array将为-1