簡體   English   中英

Perl:匿名子程序中的原型

[英]Perl: prototype in anonymous subroutine

我目前正在學習有關類型和名稱空間的Perls系統。 所以我寫了一個模塊,它接受一個常量的值和名稱兩個參數,並將常量輸出到調用者。 $ package變量等於caller [2]。

*{"$package::$name"} = sub () { return $value; };

上面的代碼完成了將匿名子例程導出到調用者符號表中的工作。 因為我的目標是構建我自己的常量實現,子例程有一個空原型,這意味着它是一個只讀子程序。

但這是我的問題:原型不起作用。 所以

print &TestConst; #works well
print TestConst(); #works well
print TestConst; #Name "main::TestConst" used only once: possible typo at testscript.pl line 7.

我的想法有什么問題嗎? 還有另一種方法嗎?

您可以在運行時定義所需的所有符號,但原型只會影響之后編譯的代碼,因為原型會影響對子調用的解析和編譯方式。 例如:

use strict;
use warnings;

package Foo;

BEGIN {
    *Foo::bar = sub () { 42 };
}

*Foo::baz = sub () { 43 };

my $bar = bar;
my $baz = baz;

print "bar = [$bar], baz = [$baz]\n";

如果我們運行它,它會死於:

在tprot.pl第13行使用“嚴格潛艇”時不允許使用Bareword“baz”。

這是由strict引起的編譯時錯誤:編譯器看到符號baz並且不知道它是什么,因為typeglob *Foo::baz直到運行時才會被改變。 但是bar工作正常,因為它是在BEGIN塊中定義的,它在編譯期間立即執行。

IOW,因為裸字是模棱兩可的,Perl需要在編譯時知道它是sub還是其他東西。 因此,您可以在import期間(在隱式BEGIN塊中執行)安裝這些,但不能在運行時安裝。

另外,原型會影響編譯語義; 一個常量子程序(如constant.pm所做的那樣)被優化掉了。 其他原型導致解析器改變其行為(例如可以接受代碼塊的subs。)編譯器必須在代碼中實際遇到對sub的調用之前知道所有這些內容,因此可以正確解析它們。 在解析完所有內容后,代碼就會運行。

使用顯式的parens或帶符號調用sub不具有此限制,因為Perl在運行時足夠聰明,知道這些是子例程調用,並在符號表中動態查找它們。

暫無
暫無

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

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