2016-07-06 6 views
-1

私は次のPerlモジュールがあります:私は入力するとすぐに実行されます印刷ありモジュールは異なる動作を実装する

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; 

「ログを使用します。」任意のPerlスクリプトから。いつかこのプリントがここになければならない場合もあります(この状況は、私が書いた他のモジュールにも当てはまります)。

このスクリプトでは、インスタンスごとにプリントを「アクティブにする」か「非アクティブ化する」方法がありますか?

#!/usr/bin/perl -w 

use strict; 
use warnings; 

use Log; 

Log_Send("Hello world !"); 

私がインポートするすべてのモジュールで "有効/無効"デバッグと似ていますが、方法はありますか?

編集:私は自分自身のインポートサブを実装しようとしましたが、@EXPORTのマカニズムを失ったか、またはコピー元/エクスポート元のソースコードをコピーしても何も分かりません。 @EXPORTのようなmecanismで "import"を実装するためのチュートリアルがあれば、私はそれに満足しています。

+0

理想的には、「印刷」を実行する条件はありますか? – ikegami

+0

Idealyは、私は(どこかのモジュール内のコードがで、サブを、BEGIN ENDすることができる、)コードのこの部分を実行「「私のモジュールはすべてに言うだろう」」何か「main.pl」から設定したいです。具体的には、私は新しいPerlプログラムを書いたとき、私は印刷したくない、と私は生産にPerlプログラムを送信するとき、私が印刷したいです。このような振る舞いを実装できるのであれば、私は "DEV_MODE"にいるか、 "PROD_MODE"に入っていれば私のモジュールとは違う振る舞いをすることができますが、 "DEBUG_ON"と "DEBUG_OFF"(と私の未来のPerlスクリプト)。私自身のインポート機能を作成 –

答えて

1

useを呼び出すと、モジュールのネームスペースからimportを呼び出すことを意味します。 import関数を作成し、printをその中に移動し、printが必要でないことを示すフラグを受け入れるようにします。

+0

は私が@EXPORTのmecanismを失わせます。 何がdescibe、私はそれが私のために理想的になると思うが、私はやることができなかったものです。 –

+2

@ Tom's、いいえ、あなたは 'sub import {...; goto&Exporter :: import; } '。 'ので、私はこれは素晴らしい解決策だとは思わない、あなたのスクリプトが'ログイン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から」答えた。2ワードの答えを誤解するのは簡単である。 – ikegami

関連する問題