【发布时间】:2015-01-11 06:31:32
【问题描述】:
看似简单的一段代码肯定没有按照我的意愿去做。
有人可以向我解释它的作用和原因吗?
my $dir = './some/directory';
if ( -d $dir && <$dir/*> ) {
print "Dir exists and has non-hidden files in it\n";
}
else {
print "Dir either does not exist or has no non-hidden files in it\n";
}
在我的测试用例中,该目录确实存在并且它是空的。但是,if 的 then(第一个)部分触发了,而不是预期的 else 部分。
我不需要任何人建议如何完成我想要完成的事情。我只是想了解一下 Perl 对这段代码的解释,这绝对不符合我的。
【问题讨论】:
-
你真的应该看看
<$dir/*>返回的你认为不存在的东西。 -
我做到了!我用
join( ', ', <$dir/*> )或类似的东西打印它,它返回了我认为的结果。这也是我真正糊涂的原因之一。 @ysth 下面的回答似乎解开了这个谜。 -
@ysth所说的意味着您正在此代码片段之外更改$dir。对吗? -
@borodin:我不这么认为。他说,在第一次调用时,它会返回第一个文件,第二次,第二次,直到它返回所有文件,即使在程序的不相关部分中使用也是如此。 $dir 可能会或可能不会改变,这没有区别。 Perl 在其他地方也有这个非常奇怪的习惯,我刚记得:upon2020.com/banter/2014/10/08/perl-really
-
但是如果没有匹配
./some/directory/*的文件或目录,那么glob应该在标量上下文中返回undef,在列表上下文中返回一个空列表:没有第一个文件。我已经运行了所有我能想到的测试,我无法复制你的例子。我知道each,但到目前为止我所读到的内容都无法解释您所描述的内容。