簡體   English   中英

關於Perl模塊使用的爭論

[英]Argument to Perl module use

具有C語言背景,我可能會嘗試以錯誤的方式編寫某些內容,因此請您諒解初學者的問題。 這是我在尋找的東西:

我願意有一個Perl模塊Verbose (不是類),它定義了一個稱為verbose_print()的子例程。 僅當模塊的變量$verbose為true時,此子例程才會打印其參數(字符串)。 當然,我願意做的是從命令行中使用-V選項(使用Getopt::Long ),然后在-V開關打開的情況下,調用Verbose模塊,其值為'true'為$Verbose::verbose

一種解決方法是擁有一個verbose_init函數,該函數在Verbose模塊中將$Verbose::verbose變量設置為true。

另外一個是宣布$verbose我的模塊中使用our ,然后$Verbose::verbose = $command_line_verbose_switch在主腳本。

我想知道在perl中是否還有另一種方法?

不必擔心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成為變量,這意味着它在$verbose_value調用之間位於包外部。

注意我如何使用Exporter@EXPORT_OK數組。 您可以使用@EXPORT ,它會自動導出所有命名的子例程,但是現在這被認為是不好的舉止,因為您最終可能會覆蓋同名的某人的本地子例程。 最好使其明確。 如果有問題,他們可以使用詳細子例程的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);

現在,您的詳細子例程可能如下所示:

    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 )。

“另一種方式”之一是創建import功能:

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"
}

但是,我認為更簡單,更易於使用的是使功能更強大。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM