2013-05-13 2 views
2

У меня есть программа Perl для чтения .html и работает только в том случае, если программа находится в том же каталоге, что и .html.
Я хотел бы иметь возможность запускать в разных каталогах и передавать местоположение html в качестве параметра. Программа (пример оболочки ниже) пересекает подкаталог «sub» и его подкаталоги для поиска .html, но работает только тогда, когда мой файл perl находится в том же подкаталоге «sub». Если я помещаю файл Perl в домашний каталог, что на один шаг назад из подкаталога «sub», он не работает.Попытка передать подкаталог в качестве параметра в Perl

В оболочке, если я нахожу «perl project.pl ./sub» из моего домашнего каталога, он говорит, что не открывается ./sub/file1.html. Данный файл или каталог отсутствует. Однако файл существует в этом точном месте. file1.html - это первый файл, который он пытается прочитать.

Если я сменил каталоги в оболочке на этот подкаталог и переместил файл .pl , то тут же скажите в оболочке: «perl project.pl ./» все в порядке.

Для поиска каталогов, я был с помощью File :: Find понятие, которое я нашел здесь: How to traverse all the files in a directory; if it has subdirectories, I want to traverse files in subdirectories too Find::File to search a directory of a list of files

#!/usr/bin/perl -w 
use strict; 
use warnings; 
use File::Find; 

find(\&directories, $ARGV[0]); 

sub directories { 
    $_ = $File::Find::name; 

    if(/.*\.html$/){#only read file on local drive if it is an .html 
     my $file = $_; 
     open my $info, $file or die "Could not open $file: $!"; 
     while(my $line = <$info>) { 

     #perform operations on file 
     } 
     close $info; 
    } 
    return; 
} 

ответ

3

В documentation of File::Find он говорит:

Вы ChDir() 'd до $ File :: Find :: реж когда функция вызывается, если no_chdir не был указан. Обратите внимание, что при переходе на каталоги корневой каталог (/) является несколько особым случаем , поскольку конкатенация $ File :: Find :: dir, '/' и $ _ не равна , буквально равная $ File :: Find :: имя.

Итак, вы на самом деле находитесь на ~/sub. Используйте только имя файла, которое равно $_. Вам не нужно перезаписывать его. Удалить строку:

$_ = $File::Find::name; 
+0

Спасибо, удалив, что сработало отлично. – com

1

find изменяет каталог автоматически, так что $File::Find::name уже не относительно текущего каталога ,

Вы можете удалить эту строку, чтобы заставить его работать:

$_ = $File::Find::name; 

File::Find Смотрите также no_chdir.

+0

Благодарим вас, удалив, что сработало отлично. – com

1

Из документации File::Find:

Для каждого файла или каталога найден, он вызывает & хотел подпрограмму. (см. Ниже подробную информацию о том, как использовать функцию &). Кроме того, для каждого найденного каталога он будет chdir() в каталог и продолжите поиск, вызвав функцию & на каждый файл или подкаталог в каталоге.

(курсив мой)

Причина, по которой не найти ./sub/file1.html потому, что, когда open называется, File :: Find уже chdir ред вас в ./sub/. Вы должны открыть файл только как file1.html.