[perl]perl的反射機制

來源:互聯網
上載者:User
perl是一種非常靈活的指令碼語言。 也存在對反射的需求情境。 反射就是將字串轉換為對應的語言對象。

(不考慮eval這樣的終極必殺技) 1.反射為普通變數 這個是不支援的,就是說,你沒辦法實現

my $a="b";my $b="123";print \$a; # 企圖得到"123"是不可能的
變通的辦法是使用hash
my $b='123';my $c{'b'}=$b;my $a='b';print $c{$a}; #可以從$a得到'123'
2.反射為函數 perl的函數存在一些黑魔法。不過還是建議,盡量通過hash來訪問
#反射函數#根據字串變數,動態執行函數(根據$fname調用到hello)use strict;my $fname='hello';sub hello($){my ($n)=@_;print "hello $n\n";}#hello->(); #strict不允許。原地引用&hello(1); #正式的函數調用hello(2); #這麼寫也允許#正規的函數引用my $fname3=\&hello; #\&代表取函數引用&$fname3(3); #&執行$fname3->(4);#正規的做法。先註冊函數到hash。my %fh;$fh{"hello"}=\&hello;$fh{"$fname"}(9); #再通過名字變數調用#&{$fh{"$fname"}}(9); #也可以#反射的黑魔法"hello"->(5); #允許。但是沒什麼用#$fname->(); #strict不允許#&{$fname}();#strict不允許#\&{$fname}->(); #strict不允許&{\&{$fname}}(6); #這麼寫可以,不過有點難懂my $fname2= \&{"hello"}; #magictrick&$fname2(7);my $fname1 = \&{$fname};&$fname1(8); #前面的&是必需的

3.反射為模組 可以通過 require $mname;  就可以了 不過use不行。 perl沒有python那樣的getattr函數 不過可以和函數反射一樣處理

#!/usr/bin/perluse FindBin qw($Bin);use lib "$Bin";my $mname="Foo1.pm"; #通過變數載入模組#require Foo1;require $mname;Foo1::bar( "a" );Foo1::blat( "b" );my $fname="Foo1::blat";my $fname1 = \&{$fname}; #通過變數執行函數&$fname1("b");

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.