假设我按如下方式创建一个对象:
$object22=new somepackage("stuff");
后来我想运行这样的子程序:
$object22->somesubroutine();
我想在子程序“somesubroutine”中捕获字符串“object22”。 我试过了:
$self=@_;
print $self;
但这只是给了我somepackage=HASH(somehexnumber)
请告诉我这是否可行,如果是,请执行以下操作。
答案 0 :(得分:7)
如果没有可怕的hackery(通过堆栈帧查看),这是不可能的。该名称只是对象的引用,它不是对象的一部分。
你正以错误的方式解决问题。或许更多地描述一下?
答案 1 :(得分:2)
我可以想出两种方法来解决你的问题:
保
答案 2 :(得分:1)
这可能是通过堆栈帧爬行的可怕hackery。或许像PadWalker
这样的东西。
但你可能接近这个问题了。
答案 3 :(得分:1)
使用堆栈帧的另一种方法是使用caller ()
来获取调用例程的行,然后读取程序文件并获取类似的变量名。
#!/usr/local/bin/perl
use warnings;
use strict;
package X;
sub new
{
bless {};
}
sub getdownonthatcrazything
{
my ($self) = @_;
my (undef, $file, $line) = caller ();
open my $in, "<", $file or die $!;
while (<$in>) {
if ($. == $line) {
goto found;
}
}
die "Something bad happened";
found:
if (/\$(\w+)\s*->\s*getdownonthatcrazything\s*\(\)/) {
my $variable = $1;
print "I was called by a variable called \$$variable.\n";
}
close $in or die $!;
}
1;
package main;
my $x = X::new ();
$x->getdownonthatcrazything ();
my $yareyousofunky = X::new ();
$yareyousofunky->getdownonthatcrazything ();
输出:
$ ./getmycaller.pl I was called by a variable called $x. I was called by a variable called $yareyousofunky.
这假定您的文件都在同一目录中。如果没有,您可以使用FindBin模块并搜索@INC
库等
答案 4 :(得分:0)
致电'祝福':https://metacpan.org/pod/Scalar::Util#blessed。
如果您使用驼鹿,它也会自动导出。