2012-08-15 43 views
3

目前,在調試過程中,我傾向於插入我可以定義一個可以像內置的任何地方一樣調用的子例程嗎?

carp Dumper \@foo, \%bar; 

語句到我的代碼,並定期運行到該CarpData::Dumper沒有在當前的包進口的問題。所以,現在

sub main::bla { 
    use Carp; use Data::Dumper; 
    carp Dumper @_; 
} 

我可以做

main::bla \@foo, \%bar; 

無處不在,但main::讓我很煩:爲了避免這個問題,我定義在中央文件中的以下子那總是包括在內。是否有像全局包一樣,在任何包中自動導入(就像內置插件實際上是隨處導入的)?

+1

我想說明'use'是一個編譯時指令;換句話說,如果在總是包含的某個模塊中使用'use',則這些模塊也將始終包含在內。在某些可能不會被調用的代碼中(例如,在一個條件的假分支中)放置一個'use'並不妨礙它被處理。 – raina77ow 2012-08-15 13:03:54

+0

@ raina77ow:不錯的主意。我試圖劫持常用模塊的'import'方法來在調用包中安裝'bla'。但是通用模塊默認沒有'import',所以一旦其他模塊具有'require'd或'use'd,其他模塊不需要'再次'使用它,因爲它們必須調用通用模塊的方法明確無論如何(即'Common :: foo()'而不是'foo()')。 – 2012-08-15 13:21:30

+1

'PERL5OPT'環境變量可用於始終加載特定模塊:'-MCarp' – toolic 2012-08-15 13:52:20

回答

4

你可以叫它

::bla(\@foo, \%bar); 

在早期的日子裏,我習慣把UTIL功能於一身Ut包。這很好,但我注意到我的代碼並不像我想象的那樣模塊化。每個依賴於Ut功能的模塊只有在遇到困難時才能成功執行版本該命名空間。

最後,我認爲userequire語句只是記錄依賴關係。有更靈活的方法來更改庫模塊調用的代碼,而不是在main中更改它們的實現。

例如,您可以在單個use聲明中執行此操作。

use Ut blah => sub { 
    use Carp; 
    use Data::Dumper; 
    carp Dumper @_; 
}; 

,並定義導入:

sub import { 
    shift; # It's just me 
    my ($name, $impl) = @_; 
    if ($name eq 'blah' && ref($impl) eq 'CODE') { 
     *blah = $_[1]; 
    } 
    ... 
} 

我還是用ut模式,當我開發了很多代碼一次。但我不介意寫

ut:dump_var($var) 

,而不是保存3-4個字符(因爲有時我把它叫做U::)。

現在,看起來你不想長期這樣做,並且傾銷你的變量對於開發來說是有用的。如果你真的想這樣做,Smart::Comments做它像這樣:

### @foo 
### %bar 

它所需要的是一個使用語句。

use Smart::Comments; 
+0

':: bla'已經足夠接近了。 ;-) – 2012-08-15 13:22:58

+0

請記住,'''是'''的一種古老形式,你可以說'sub U'dump_var {...} ... U'dump_var($ var)'它不是fubar你的語法熒光筆。 – mob 2012-08-15 19:03:23

+0

@mob,我從來沒有用過''',我不寒而慄想着這樣做。我一直想知道它是什麼。如果我真的想保存輸入,我只能稱之爲'dv':'U :: dv' – Axeman 2012-08-15 19:45:15

1

也許只是更好地做出另一個包與出口和需要的東西? 贊,MyTest。PM:

package MyTest; 

use strict; 
use Carp; 
use Data::Dumper; 


use base qw(Exporter); 
our @EXPORT = qw(
    debug 
) 

sub debug { 
    carp Dumper @_; 
} 

1; 

那麼你就可以只寫在你的腳本:

use MyTest; 

debug {a => 'b', c => 'd' } 
0

有趣的事實:Some symbols是,他們總是引用它們的值在main包神奇。您可以將子例程分配給這些符號,並且它們將在任何包中可見。

{ 
    package Foo; 

    # special names _ ARGV ARGVOUT ENV INC SIG STDERR STDIN STDOUT 
    sub ENV { print "In main::ENV ...\n" } 
    sub STDIN { print "In main::STDIN ...\n" } 
    sub _ { print "In main::_\n" } 

    # names that begin with^+ upper case letter, or all digits 
    *{^T} = sub { scalar localtime }; 
    *{^Gmtime} = sub { scalar gmtime }; 
    *43 = sub { 42 }; 

    use Data::Dumper; 
    *{^D} = \&Data::Dumper::Dumper; 
} 

{ 
    package Bar; 
    &ENV; 


    STDIN(); 
    print "The time is ", &^T, "\n"; 
    print "In London it is ", &{^Gmtime}, "\n"; 
    print "The answer is ", &43, "\n"; 

    print "\@foo is ", &^D(\@foo); 
} 

這些都不推薦,除非你想驅動下一個維護你的代碼瘋狂的人。

相關問題