2014-03-19 1 views
0

나는 같은 서브 인덱스 기능을 가지고 :Perl Catalyst 응용 프로그램으로 파일에 쓰려면 어떻게해야합니까? 내 Root.pm의 내부

당신이 그것을 호출시와 동일하거나 다른 디렉토리에있는 파일에 쓸 수있는 방법
sub index :Path :Args(0) { 

    my ($self, $c) = @_; 

    #basic file IO attempt to write to a file 
    my $file = 'test3.log'; 
    open(my $fh, '>>', $file); 
    print $fh "I can write to a file\n"; 
    close $fh; 

    $c->stash({ 
     template => 'index.tt', 
    }); 

    #debug that doesnt work for some reason 
    $c->log->debug('Does this actually work?');  
} 

?

+1

te 파일의 전체 경로를 지정하기 만하면됩니다. – Toto

+0

하지 마! 펄 모듈은 데이터가 아닙니다. 데이터와 애플리케이션을 섞지 마십시오. 촉매 구성에 데이터를 저장할 디렉토리를 지정한 다음 해당 구성을 사용하여 적합한 경로를 찾으십시오. – Quentin

+0

이 경우, 프로젝트의 루트 폴더에 test3.log 파일이 생성됩니다. 특정 파일을 원할 경우 M42는 "그냥 파일의 전체 경로를 지정하십시오"라고 말합니다. – PseftiS

답변

0

"현재"디렉토리에 파일을 쓸 수 있습니다. 그러나이 디렉토리는 귀하의 Root.pm이있는 곳이 아닙니다. scripts 디렉토리의 웹 서버 스크립트로 Catalyst를 시작하는 경우 스크립트를 시작한 test3.log이 있습니다.

는 현재 파일이있는 디렉토리를 찾아 __FILE__를 사용하여 경로 이름 extrect하려면

use File::Basename; 

# ... 

sub index :Path :Args(0) { 

    my ($self, $c) = @_; 

    #basic file IO attempt to write to a file 
    my $dirname = dirname(__FILE__); 
    my $file = $dirname.'/test3.log'; 
    open(my $fh, '>>', $file) or die $!; 
    print $fh "I can write to a file\n"; 
    close $fh; 

    # ... 
} 

dirname 루틴에 대한 자세한 내용은 https://metacpan.org/pod/File::Basename를 참조하십시오.

1

언제든지 응용 프로그램의 루트를 MyApp->path으로 찾을 수 있습니다.하지만 런타임에 파일을 생성 할 때 응용 프로그램 영역에 파일을 두지 않으려 고 할 수 있습니다.

많은 사람들이 보았던 것은 /var에 해당 내용을 넣었습니다.

0

동일한 파일에 동시 기록을 방지하려면 각 방법에서 디스크에 쓰는 대신 Log::Log4perl::Catalyst과 같은 패키지를 사용해야합니다. 다른 레벨의 로그 (디버깅, 경고, 오류), 다른 출력 등을 사용하는 것과 같이 훨씬 더 유연합니다.