2011-12-21 6 views
3

Как бы вы писали скрипт perl, чтобы проверить, существует ли файл?Проверка наличия файла (Perl)

Например, если я хочу проверить, существует ли файл $ $ в $ location.

В настоящее время я использую длинную подпрограмму (см. Ниже), и я уверен, что есть более простой способ сделать это?

# This subroutine checks to see whether a file exists in /home 
sub exists_file { 
    @list = qx{ls /home}; 
    foreach(@list) { 
    chop($_); 
    if ($_ eq $file) { 
    return 1; 
    } 
} 

ответ

11

Используйте -e оператор:

if (-e "$location/$file") { 
    print "File $location/$file exists.\n"; 
} 

Вы можете захотеть использовать что-то более надежное, чем конкатенация присоединиться $location с $file, хотя. См. Также документацию для File::Spec (входит в комплект поставки Perl) или Path::Class.

+2

Существует также оператор '-f' для проверки того, что это файл и' -d' для каталогов. Есть и другие. Вы можете увидеть исчерпывающий список здесь, в выдержке из man-страницы [perlfunc] (http://perldoc.perl.org/functions/-X.html). – zostay

1

да, при условии, $your_file это файл, который вы проверки (что-то вроде /home/dude/file.txt):

Вы можете просто использовать

if(-e $your_file){ 
    print "I'm a real life file!!!" 
} 
else{ 
    print "File does not exist" 
} 
1
sub file_exists { 
    return 1 if -f '/home/' . $_[0]; 
} 

И назвать это как например

if (file_exists('foobar')) { ... } # check if /home/foobar exists 
+0

В некоторой степени избыточный уровень для использования подпрограммы для функции. =) – TLP

+3

'return 1 if ...' плохой стиль в лучшем случае, антипаттерн в худшем. Просто верните логическое выражение! 'return -f ...' – daxim

3

Решение «Все остальные» не учитывает «невозможность определить, существует ли файл», поскольку «файл не существует». Далее не страдает от этой проблемы:

sub file_exists { 
    my ($qfn) = @_; 
    my $rv = -e $qfn; 
    die "Unable to determine if file exists: $!" 
     if !defined($rv) && !$!{ENOENT}; 
    return $rv; 
} 

Если вы хотите, чтобы проверить, является ли это обычный файл (т.е. не каталог, символическая, и т.д.) или нет,

sub is_plain_file { 
    my ($qfn) = @_; 
    my $rv = -f $qfn; 
    die "Unable to determine file type: $!" 
     if !defined($rv) && !$!{ENOENT}; 
    return $rv; 
} 

Документация: -X

+1

Что такое '$! {ENOENT}'? – Zaid

+0

@ikegami Интересно. Но это много шаблонов. Не нашел модуль на cpan, который поставляет ваши чеки. Вы знаете об этом? –

+1

@ Джан Хартунг, может быть, автоди? – ikegami

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