2013-05-13 3 views
2

.html 파일을 읽는 Perl 프로그램이 있고 프로그램이 .html 파일과 같은 디렉토리에있는 경우에만 작동합니다.
다른 디렉토리에서 시작하여 html의 위치를 ​​매개 변수로 전달할 수 있기를 바랍니다. 프로그램 (아래의 셸 예제)은 서브 디렉토리 "sub" 과 하위 디렉토리를 탐색하여 .html 파일을 찾지만 내 perl 파일이 동일한 서브 디렉토리 "sub"에있을 때만 작동합니다. Perl 파일 을 하위 디렉토리 "sub"의 한 단계 뒤로 홈 디렉토리에 넣으면 작동하지 않습니다.Perl에서 서브 디렉토리를 매개 변수로 전달하려고 시도합니다.

셸에서 "perl project.pl ./sub"를 내 홈 디렉토리에 입력하면 은 열리지 않습니다 ./sub/file1.html. 해당 파일이나 디렉토리가 없습니다. 그러나 파일은 정확한 위치에 존재합니다. file1.html은 읽으려고하는 첫 번째 파일입니다.

쉘의 디렉토리를 해당 서브 디렉토리로 변경하고 .pl 파일을 옮긴 다음 쉘에서 "perl project.pl ./"라고 말하면 모든 것이 정상입니다.

이 파일을 사용하여 내가왔다, 디렉토리를 검색하려면 : 내가 여기 개념을 찾기 : 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

$File::Find::name 현재 디렉토리에 상대적으로 더 이상하지 않도록 find 자동으로 디렉토리를 변경
#!/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

:

당신은 CHDIR()가 '$에 거라고 파일 :: 찾기 :: 디렉토리를 함수가 호출 될 때, 을 no_chdir 지정하지 않는 한. 디렉토리로 변경할 때 루트 디렉토리 (/)는 다소 특별한 경우입니다 $ File :: Find :: dir, '/'및 $ _의 연결이 $ File과 똑같은 이 아니므로 유의하십시오. :: 찾기 :: 이름.

실제로는 ~/sub입니다. 파일 이름은 $_ 만 사용하십시오. 그것을 덮어 쓸 필요는 없습니다. File::Find 문서에서

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

완벽하게 작동하는 것을 제거해 주셔서 감사합니다. – com

1

.

당신은 일을 얻기 위해이 줄을 삭제할 수 있습니다

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

File::Findno_chdir를 참조하십시오. 그것은 말한다 documentation of File::Find에서

+0

삭제 해 주셔서 감사합니다. 완벽하게 작동했습니다. – com

1

: 라인을 제거 찾은 각 파일이나 디렉토리를 들어

는, 그것은 &이 서브 루틴을 원 호출합니다. (& 원하는 기능 사용 방법에 대한 자세한 내용은 아래 참조). 또한 발견 된 각 디렉토리에 대해 은 디렉토리 인에 chdir()을 수행하고 디렉토리의 각 파일 또는 하위 디렉토리 에 &의 원하는 기능을 호출하여 검색을 계속합니다.open가 호출 될 때, 파일 :: 찾기가 ./sub/에 이미 chdir 에드을 가지고 있기 때문에

(강조 광산)

./sub/file1.html을 찾는 아니에요 이유입니다. 그냥 file1.html으로 파일을 열 수 있어야합니다.

관련 문제