2013-04-22 4 views
0

나는 여러개의 출력 파일을 생성 한 파일을 파싱 중이다. perl 스크립트가 실행 된 동일한 폴더의 특수 디렉토리에 출력 파일을 저장하고 싶습니다. 디렉토리가 이미 있으면 해당 디렉토리에 파일을 넣으십시오. sudo 권한이없는 사용자는 현재 작업 디렉토리에 파일을 만듭니다.출력 파일을 디렉토리에 저장하고 출력 파일의 이름을 인쇄하는 방법은 무엇입니까?

All done! Please look in 'output.txt' for the output. 

출력 파일이있는 경우 : 내가 구문 분석하고 파일을 처리 한 후 스크립트의 끝에서

use strict; use warnings; 

sub main { 
    my $directory = "pwd/test.pl_output"; 

    unless(mkdir $directory) { 
     return 0; # unable to create directory (it either already exists 
         # or you don't have sudo privileges) 
    } else { 
     return $directory 
     } 
} 

if (my $PATH = main()){ 
    open(my $fh, '<', 'input.txt') or die $!; 
    open(my $output, '+>', $PATH.'/output.txt') or die $!; 
} else { # create the output file as usual 
    open(my $fh, '<', 'input.txt') or die $!; 
    open(my $output, '+>', 'output.txt') or die $!; 
} 

print "All done! Please look in \$output\n"; 

, 나는 쉘 프롬프트에 다음을 인쇄하고 싶습니다 새 디렉토리를 만들려면 다음을 인쇄하십시오.

All done! Please look in 'output.txt' in the directory '~/path/to/output.txt' for the output. 

내 코드가 작동하지 않습니다.

+1

필자는 perl에 익숙하지 않지만, 여기에'$ PATH/output.txt''라는 질문이 있습니다. $ PATH에'''안에 값이 대체됩니까? – abasu

+0

abasu 다른 좋은 캐치입니다. 작은 따옴표는 보간하지 않습니다. 나는 우리가 실제 복사 - 붙여 넣기 코드를 보지 못하고 있다고 생각한다. – DavidO

+0

필자는 [perl에서 디렉토리를 생성하는 것이 가능하다는 것을 알고있다] (http://www.caveofprogramming.com/perl/perl-mkdir-how-to-create-directories-in-perl/). 그러나 내가하려는 일의 나머지가 가능한지 나는 모른다. – cooldood3490

답변

3

기존 코드에 몇 가지 심각한 문제가있었습니다. 하나는 큰 따옴표로 묶인 문자열 안에 pwd을 사용하는 것입니다. 그건 그냥 작동하지 않습니다. 이면 pwd을 백틱 내부에 사용하고 출력을 캡처하지만 큰 따옴표 리터럴은 사용할 수 없습니다.

또 다른 문제는 코드의 논리가 대상을 정상적으로 저하시키려는 방식에 대한 설명에 복잡하지 않다는 것입니다.

다음 코드는 먼저 실행 파일의 디렉토리에 "특별한"라는 이름의 디렉토리를 찾습니다. 존재하지 않으면 생성하려고 시도합니다. 생성이 실패한 경우 (아마도 권한으로 인해) 사용자의 현재 작업 디렉토리에서 "special"이라는 디렉토리를 찾습니다. 존재하지 않으면 생성하려고 시도합니다. 그것이 실패하면 설명적인 메시지와 함께 죽을 것입니다.

이 지점을 지나면 "special"디렉토리가 미리 존재하거나 허용되는 경로 중 하나를 따라 생성됩니다. 그런 다음 파일이 열립니다. 출력 파일을 열지 못하면 우리는 죽습니다. 그렇지 않으면 파일을 계속 작성하십시오. 그런 다음 입출력 파일을 닫으십시오. 마지막으로, 출력 파일을 찾을 수있는 경로를 인쇄하십시오.

use strict; 
use warnings; 

use FindBin; 
use File::Path qw(make_path); 

my $special_dir = 'special'; 
my $filename = 'my_file.txt'; 


my $bin = $FindBin::Bin; 

my $path; 


if(not defined($path = get_path("$bin/$special_dir", "./$special_dir"))) { 
    die "Unable to find or create a suitable directory for output file."; 
} 

my $output_filename = "$path/$filename"; 


open my $in_fh, '<', 'input.txt' or die $!; 
open my $out_fh, '+>', $output_filename or die $!; 

# Do whatever it is you want to do with $in_fh and $out_fh.... 

close $out_fh or die $!; 
close $in_fh or warn $!; 

print "All done! Please look in $output_filename for the output.\n"; 



sub get_path { 
    my @tries = @_; 
    my $good_path; 
    for my $try_path (@tries) { 
    if(-e $try_path and -d _ and -w _) {   # Path exists. Done. 
     $good_path = $try_path; 
     last; 
    } 
    elsif(eval { make_path($try_path); 1; }) { # Try to create it. 
     $good_path = $try_path;      # Success, we're done. 
     last; 
    } 
    } 
                # Failure; fall through to 
                # next iteration. If no 
                # more options, loop ends 
                # with $path undefined. 
    return $good_path; 
} 

나는 실행 파일을 찾기 위해 Perl 모듈 FindBin을 사용하고 있습니다. File :: Path는 디렉토리를 만드는 데 사용됩니다.

0

과거에는 여러 차례 쉘 스크립트를 사용하여 perl 스크립트를 사용하는 것이 좋았습니다. 파싱을위한 펄 스크립트 및 폴더 처리를위한 쉘 스크립트. 그리고 쉘 스크립트와 함께 perl 스크립트를 쉽게 포함시킬 수 있습니다. 더 쉽고 편리합니다.

관련 문제