我见过很多关于使用Perl来计算目录中特定文件的帖子,其中一个显示了这段代码
@filesInDirectory = glob("$directory$fileNameRegex");
$numberOfFiles = @filesInDirectory;
然后如果我跟着这个:
print LOGFILE $#filesInDirectory;
print LOGFILE $numberOfFiles;
日志将有01.如果混淆是这样的:当我正在寻找的文件不存在时,为什么$ numberOfFiles 1而不是0?
答案 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