package Bar;
use Foo;
sub bar { fooit "hello from bar"; }
package Foo;
sub fooit {
# Somehow I want this function to know it was called
# from the "Bar" module (in this case).
}
優選地,這將在不顯式傳遞包含調用模塊名稱的參數的情況下完成。一個函數可以告訴從哪個模塊調用它?
package Bar;
use Foo;
sub bar { fooit "hello from bar"; }
package Foo;
sub fooit {
# Somehow I want this function to know it was called
# from the "Bar" module (in this case).
}
優選地,這將在不顯式傳遞包含調用模塊名稱的參數的情況下完成。一個函數可以告訴從哪個模塊調用它?
使用內置的caller
應該是最簡單也是最直接的方法,但Devel::Backtrace也是值得一看的CPAN模塊,它可以通過優雅的界面提供更多的細節信息。
package Foo;
use Devel::Backtrace;
sub fooit {
my $backtrace = Devel::Backtrace->new;
print $backtrace->point(1)->package, "\n\n";
print $backtrace;
}
package Bar;
sub bar {
Foo::fooit('hello from bar');
}
package main;
Bar::bar();
輸出:
Bar
Devel::Backtrace::new called from Foo (test.pl:5)
Foo::fooit called from Bar (test.pl:14)
Bar::bar called from main (test.pl:19)
你或許應該解釋一下爲什麼你想知道的,因爲這是很難的東西,你可以在所有可能的情況下,依靠對大多數的目的。 – tchrist 2013-03-08 17:54:23
這是爲了記錄目的,所以我可以說「fooit在00:00:00從酒吧叫來」。你能詳細說明這裏的陷阱嗎? – gcbenison 2013-03-08 17:56:06
我經常編寫自己的小調試函數,這樣可以工作,所以我可能知道你來自哪裏。通常人們不想知道調用框架被編譯到哪個包中,而是想知道它的文件名和行號,'warn'和'die'沒有給出新行結束符。如果有的話,「陷阱」是任何人都可以寫'{package Other; some :: function()}',它不像在'Other.pm'文件或類似的東西。實際上,他們也可以對文件和行進行細化處理,但是我猜如果你不處於某種惡劣的環境中,這並不重要。 – tchrist 2013-03-08 17:59:00