我有一個正則運算式,我希望從我的模塊中匯出,代碼如下:
package regExport;
use strict;
use warnings;
use Exporter qw(import);
our @EXPORT_OK = qw(re);
my re = /.../; # my regex is here
并在此處匯入
use regExport qw(re);
my @li = ("man", "qwrt", "mnbv", "azx", "aeiou");
foreach my $st (@li) {
$li =~ a/b/; # I wish to test my regex on each of these strings
}
任何人都知道我將如何去做。我對如何去做這件事感到相當困惑。
uj5u.com熱心網友回復:
最簡單但不是最好的方法(見下文)是使用模式創建變數。最好使用qr 運算子,然后可以匯出變數
package RegExport;
use strict;
use warnings;
use Exporter qw(import);
our @EXPORT_OK = qw($re_pattern);
our $re_pattern = qr/(\w )/i; # capture a "word" case-insensitive
1;
請注意,根據 Pascal 案例的通常 Perl 約定,我已經將包名稱大寫。(然后檔案名需要跟在那個后面并且是RegExport.pm。)
然后將其用作
use warnings;
use strict;
use feature 'say';
use FindBin qw($RealBin);
use lib $RealBin;
use RegExport qw($re_pattern);
my $text = q(Some text with a bunch of words. In sentences.);
while ($text =~ /$re_pattern/g) {
say "Word: $1";
}
在這里,我希望RegExport.pm與程式位于同一目錄中。使用$RealBin是向包含庫的搜索路徑添加一個相對于程式本身所在位置的目錄(在這種情況下,程式的目錄)的好方法。
如果您真的想使用這樣的變數(但請繼續閱讀!),則無需從其包中匯出它,但可以在呼叫者中使用其完全限定名稱
use RegExport;
... $RegExport::re_pattern ...
這是有時在庫中針對各種設定所做的事情。
但是,檔案對此有一點要說,在 什么不匯出的部分中
千萬不能匯出變數名。
@EXPORT_OK = qw($svar @avar %hvar); # DON'T!匯出變數不是一個好主意。它們可以在引擎蓋下改變,在遠處引發可怕的影響,很難追蹤和修復。相信我:它們不值得。
這很好的建議是偶爾違反圖書館,有一個良好的效果; $RealBin上面使用了一個例子。但是如果你沒有壓倒一切的理由,那么最好遵循它——并使用一個函式來回傳值
package RegExport;
use strict;
use warnings;
use Exporter qw(import);
our @EXPORT_OK = qw(get_pattern);
sub get_pattern {
my @specs = @_; # any input on how to form the pattern
my $re_pattern = qr{...};
return $re_pattern;
}
1;
現在你用它作為
use RegExport qw(get_pattern);
my $re = get_pattern(); # or pass extra rules for how to form it
并$re在正則運算式中用作現成的模式。
現在這段代碼的用戶和未來的代碼維護者都很高興。
uj5u.com熱心網友回復:
你很接近。您的代碼只有幾個問題:
- 要匯出到另一個包(即
main)的變數需要宣告為包變數(withour)而不是詞法變數(withmy)。 - 您正在呼叫匹配運算子 (
/ ... /) 而不是宣告和創建正則運算式。你需要qr/ ... /代替。 - 盡管您已加載
Exporter,但您還需要將您的類設為子類才能使用import(). - 您的包最后需要回傳一個真值。
所以我在模塊中有這個:
package RegExport;
use strict;
use warnings;
use Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw($re);
our $re = qr/[aeiou]/; # my regex is here
1;
這在測驗程式中:
use lib '.';
use feature 'say';
use RegExport;
my @li = ("man", "qwrt", "mnbv", "azx", "aeiou");
foreach my $st (@li) {
if ($st =~ /$re/) {
say "Match: $st";
} else {
say "No match: $st";
}
}
請注意,我已將您的包名稱更改為RegExport. Perl 的一個傳統是標準的用戶定義模塊以大寫字母開頭。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/350585.html
