0

C のバックグラウンドを持っているので、間違った方法で何かを書こうとしている可能性があるため、初心者の質問を許してください。ここに私が探しているものがあります:

Verboseというサブルーチンを定義するperl モジュール (クラスではない) を用意したいと思っていますverbose_print()。このサブルーチンは、モジュールの変数$verboseが true の場合にのみ、その引数 (文字列) を出力します。もちろん、私がやりたいことは、コマンド ラインから -V オプションを取得して ( を使用)、-V スイッチがオンの場合に、 の値を「true」にしてモジュールをGetopt::Long呼び出すことです。Verbose$Verbose::verbose

1 つの回避策は、モジュール内で変数を true にverbose_init設定する関数を用意することです。$Verbose::verboseVerbose

もう 1 つは$verbose、使用してモジュールで宣言し、our次に$Verbose::verbose = $command_line_verbose_switchメイン スクリプトで宣言することでした。

perlでこれを行う別の方法があるかどうか疑問に思っていましたか?

4

2 に答える 2

0

Perl のクラスを恐れる必要はありません。それらはパッケージとモジュールの扱いが少し異なるだけです。彼らは噛みません。しかし、あなたはクラスがないと言ったので、クラスはありません。

パッケージ変数に直接触れたくない。代わりに、サブルーチンを使用してそれらを設定します。

これが私のLocal::Verbose( に保存されているLocal/Verbose.pm

package Local::Verbose;

use strict;
use warnings;
use Exporter 'import';

# Could have used just '@EXPORT', but that's bad manners
our @EXPORT_OK = qw(verbose verbose_switch);

# Use "our", so $verbose_value is a package variable.
# This makes it survive between calls to this package

our $verbose_value;

# prints out message, but only if $verbose_value is set to non-blank/zero value
sub verbose {
    my $message = shift;

    if ( $verbose_value ) {
        print "VERBOSE: $message\n";
        return $message;
    }
    else {
        return;
    }
}

sub verbose_switch  {
    my $switch_value = shift;
    $verbose_value = $switch_value;
    return $switch_value;
}
1;

に注意してourください。これにより$verbose_valueパッケージ変数が作成されます。これは、呼び出し間でパッケージの外側に存在することを意味します。

Exporter@EXPORT_OK配列の使い方に注目してください。@EXPORT名前付きサブルーチンをすべて自動的にエクスポートする which を使用できますが、同じ名前を持つ誰かのローカル サブルーチンを覆い隠すことになる可能性があるため、今ではマナーが悪いと見なされています。明示したほうがいい。問題がある場合Local::Verbose::verboseは、冗長サブルーチンの名前を使用できます。

そして、それがどのように使用されているか

use strict;
use warnings;

use Local::Verbose qw(verbose verbose_switch);

verbose ("This is a test");

verbose_switch(1);

verbose ("This is a second test");

ところで、冗長サブルーチンを次のように呼び出すと想像してください。

 verbose($message, $my_verbose_level);

これで、verbose サブルーチンは次のようになります。

    sub verbose {
    my $message =       shift;
    my $verbose_level = shift;

    if (not defined $verbose) {
       $verbose_level = 1;
    }

    if ( $verbose_value =< $verbose_level ) {
        print "VERBOSE: $message\n";
        return $message;
    }
    else {
        return;
    }
}

これで、冗長レベルをさまざまな値に設定し、冗長ステートメントにさまざまなレベルの冗長性を与えることができます。(私は同じことをしますが、それを呼び出しますdebug)。

于 2012-11-04T16:07:56.783 に答える
-2

import「別の方法」の 1 つは、関数を作成することです。

package Verbose;
my $verbose_on;
sub import {
    $verbose_on = shift;
}
#... Your code.

これで、詳細を次のように設定できます。

if( ... ) { #check getopt
    use Verbose (1); #This will require package Verbose and call "import"
}

しかし、関数セッターを作成することは、さらに簡単でわかりやすいと思います。

于 2012-11-04T14:47:21.423 に答える