Ваша главная проблема в том, что readdir()
не возвращает то, что вы думаете, что делает. Возвращает имена файлов в каталоге. Но к именам, которые вы возвращаете, не прикреплен путь к каталогу. И оператору -s
необходим полный путь к файлу, чтобы найти его.
Так что вам нужно присоединить имя каталога самостоятельно. Примерно так будет работать:
opendir DIR, $directory ;
while (my $dir = readdir DIR) {
# Note: Full path here.
if (-s "$directory/$dir") {
print "This is an empty file";
}
}
Но есть пара других вещей, которые я исправлю. Во-первых, -s
возвращает размер файла. Так что это верно для непустого файла. Это означает, что ваша логика перевернута. Это действительно должно быть так:
if (-s "$directory/$dir") {
print "This is a non-empty file";
} else {
print "This is an empty file";
}
Стоит также отметить, что использование дескрипторов каталога bareword не очень хорошая идея. Гораздо лучше использовать лексические переменные в качестве дескрипторов. Я бы написал ваш код так:
opendir my $dir_h, $directory ;
while (my $file = readdir $dir_h) {
# Note: Full path here.
if (-s "$directory/$file") {
print "This is a non-empty file";
} else {
print "This is an empty file";
}
}
О, я также хитро изменил имя переменной. $file
кажется гораздо лучшим именем, чем $dir
: -)