2013-08-16 3 views
0

Я попробовал образец программы, которая может рассчитать размер файла, заданного в аргументах командной строки. Он дает размер правильно, когда у меня есть имя файла, хранящееся внутри переменной, но не выводит результат при получении имени файла из аргументов командной строки.Как рассчитать размер файла из аргументов командной строки в perl

#! /usr/bin/perl 
use File::stat; 

while(<>){ 
if(($_ cmp "\n") == 0){ 
    exit 0; 
} 
else{ 
    my $file_size = stat($_)->size; # $filesize = s $_; 
    print $file_size; 
} 
} 

я не получаю никакого вывода при использовании тестового файла оператора -s и я получаю ошибки при использовании модуля стат:

Unsuccessful stat on filename containing newline at /usr/share/perl/5.10/File/stat.pm line 49, <> line 1. 
Can't call method "size" on an undefined value at 2.pl line 17, <> line 1. 

1.txt это имя файла я даю в качестве входных данных.

+2

'if (($ _ cmp" \ n ") == 0)' должно быть 'if ($ _ eq" \ n ")' –

ответ

7
#!/usr/bin/perl 

for (@ARGV){ 
    my $file_size = -s $_; 
    print $file_size; 
} 

или аналогичный CMD Oneliner,

perl -E 'say "$_, size: ", -s for @ARGV' * 
+0

Это отлично работает !. Но почему мой код не работает. – Angus

+3

@Angus 'while (<>)' итерирует содержимое файла (строки) и 'for (@ARGV)' выполняет итерирование над именами файлов –

0
#!/usr/bin/perl -w 

$filename = '/path/to/your/file.doc'; 
$filesize = -s $filename; 
print $filesize; 

достаточно просто, правда? Сначала вы создаете строку, содержащую путь к файлу, который вы хотите протестировать, затем вы используете на нем -s File Test Operator. Вы можете легко сократить это в одну строку с помощью просто:

print -s '/path/to/your/file.doc'; 

Кроме того, имейте в виду, что это всегда возвращает истину, если файл больше нуля байт, но будет ложным, если размер файла равен нулю. Он делает удобный и быстрый способ проверить файлы с нулевым байтом.

+2

Пожалуйста, прочтите мой вопрос. Его получение имени файла из аргументов командной строки – Angus

+0

извините за это @Agnus. и 'perl -E 'say" $ _, size: ", -s для @ARGV' *' - правильный ответ для использования терминала. И ответ @mpapec верен. –

Смежные вопросы