[英]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.