2016-07-06 2 views
-1

나는 다음과 같은 펄 모듈이 : 내가 입력하는 즉시 실행됩니다 인쇄가모듈에서 다른 동작을 구현

package Log; 

use strict; 
use warnings; 

# Packaging 
use Exporter; 
use vars qw($VERSION @ISA @EXPORT ); 

$VERSION = '1.0.0'; 
@ISA  = qw(Exporter); 
@EXPORT = qw(Log_Send); 

my %log_g = ('PathDirFileLog' => '/some/path', 
      'File'   => undef); 

# Init 
PrivateLog_OpenFileLog(); 
print("Do not execute this code unless I want from main.pl\n"); 

END { 
    PrivateLog_CloseFileLog(); 
} 


# Public Functions 

sub Log_Send 
{ 
    my ($message) = @_; 

    # Cleaning $message 
    $message =~ s/\n+$//g; 
    $message =~ s/\n/\*/g; 

    print($message); 
    print({$log_g{'File'}} $message) if ($log_g{'File'}); 
    return (1); 
} 

# Private Functions 

sub PrivateLog_OpenFileLog 
{ 
    my $path = $log_g{'PathDirFileLog'}.'/global.log'; 

    if (!$log_g{'File'}) { 
     if (!open($log_g{'File'}, '>>', $path)) { 
      $log_g{'File'} = undef; 
      Log_Send("Failed to open '$path' in '>>' mode : $!"); 
      return (0); 
     } 
     select((select($log_g{'File'}), $|=1)[0]); 
    } 
    return (1); 
} 

sub PrivateLog_CloseFileLog 
{ 
    if ($log_g{'File'}) { 
     close($log_g{'File'}); 
     $log_g{'File'} = undef; 
    } 
    return (1); 
} 

1; 

"로그를 사용합니다;" 펄 스크립트에서. 언젠가는이 인쇄물이 여기에 있어야하고 언젠가는 없습니다 (이 상황은 필자가 쓴 다른 모듈에도 적용됩니다).

인스턴스별로이 스크립트에서 인쇄를 "활성화"또는 "비활성화"할 수 있습니까?

#!/usr/bin/perl -w 

use strict; 
use warnings; 

use Log; 

Log_Send("Hello world !"); 

내가 가져 오는 모든 모듈에서 "사용함/사용 안 함"디버그와 비슷합니다. 방법이 있습니까?

편집 : 내 고유 한 가져 오기 하위를 구현하려고했으나 @EXPORT 메카니즘을 잃었거나 복사 또는 붙여 넣기에서 소스 코드를 복사했지만 아무 것도 이해하지 못합니다. @EXPORT와 같은 mecanism으로 "가져 오기"를 구현하기위한 자습서가 있다면, 나는 그것에 만족할 것이다.

+0

이상적으로 어떤 조건에서 'print'를 실행해야합니까? – ikegami

+0

Idealy, "main.pl"에서 "내 모든 모듈"이 코드 부분을 실행 "(코드는 BEGIN, END, sub, 모듈의 모든 위치에있을 수 있음)에"무언가 "를 설정하려고합니다. 좀 더 정확히 말하면, 새로운 Perl 프로그램을 작성했을 때, 인쇄하고 싶지 않습니다. 그리고 제작 과정에서 Perl 프로그램을 보내면 인쇄하고 싶습니다. 이러한 동작을 구현할 수 있다면 "DEV_MODE"에 있거나 "PROD_MODE"에있을 경우 "DEBUG_ON"및 "DEBUG_OFF"(및 그 밖의 다른 Perl 스크립트). –

답변

1

use을 호출하면 모듈의 네임 스페이스에서 import을 호출합니다. import 함수를 만들고 print을 해당 위치로 이동하고 print이 필요하지 않음을 나타내는 플래그를 수락하도록합니다.

+0

내 자신의 가져 오기 기능을 만들면 @EXPORT 메카니즘을 잃게됩니다. 당신이 말하는 것은 그것이 내게 이상적이라고 생각하는 것이지만, 나는 실패했습니다. –

+2

@ Tom 's, 아니,'sub import {...; 이동 및 내보내기 :: import; }'. 당신의 스크립트가'use Log qw();'를 사용한다면'import'가 전혀 호출되지 않을 것입니다. 그래서 나는 이것이 훌륭한 해결책이라고 생각하지 않습니다. – ikegami

0

코드에서 실행해야하는지 여부를 결정하는 요소는 실행중인 스크립트의 이름을 기반으로합니다. 나는 이것을 매우 이상하게 생각하고 매우 형편이 좋지 않은 디자인을 발견했지만, 실행중인 스크립트의 경로가 $0에 있기 때문에 성취 할 수 있습니다.

use File::Basename qw(basename); 

if (basename($0) eq 'main.pl') { 
    ... 
} 

나는 다음과 같은 인터페이스가 더 적합 할 것이라고 생각 다음과 같이

use Carp  qw(); 
use Exporter qw(); 

sub import { 
    my $class = shift; 

    my $saw_opts = 0; 
    while (@_ && $_[0] =~ /^-/) { 
     $saw_opts = 1; 
     my $opt = shift(@_); 
     if ($opt eq '--debug') { 
     ... 
     } 
     elsif ($opt eq '--') { 
     last; 
     } 
     else { 
     Carp::croak("Unknown option $opt\n"); 
     } 
    } 

    return if $saw_opts && [email protected]_; 

    unshift @_, $class; 
    goto &Exporter::import; 
} 

당신은 그것을 사용할 수 있습니다 : 두 번째 생각에

use Log qw(--debug); 
use Log; 

    -or- 

use Log qw(--debug :DEFAULT); 

, 내가 가지고 나쁜. 그 어떤 것도 필요하지 않습니다. 원하는 것을 수행하고 스크립트에서 호출하는 하위를 만듭니다.

use Log; 
Log::init(debug => 1); 
+0

"코드에서 실행해야하는지 여부를 결정하는 요소는 실행중인 스크립트의 이름을 기반으로합니다." - 어? 내가 어디에서 그 말을 했니? 그렇게 생각하면 뭔가 잘못 쓰는 것 같아. –

+0

"두 번째로 생각하면, 나는 그렇게 나쁘다.그냥 당신이 원하는 것을 수행하고 스크립트에서 호출하는 하위를 만듭니다. "-> 아니, 왜냐하면 코드는"로그 사용 "을 사용하여 실행할 수 있기 때문에 가져 오기 재 작성을위한 힌트가 나에게 좋을 것 같아서 고마워. –

+0

나는 "이상적으로, 어떤 조건에서 인쇄가 실행되어야 하는가?"라고 물었고, "main.pl에서"대답했다. 두 단어의 대답을 오해하기 쉽다. 명확히 해두 자. – ikegami

관련 문제