如何在Perl中获取对象的名称?

时间:2010-08-31 02:40:07

标签: perl class object hash

假设我按如下方式创建一个对象:

$object22=new somepackage("stuff");

后来我想运行这样的子程序:

$object22->somesubroutine();

我想在子程序“somesubroutine”中捕获字符串“object22”。 我试过了:

$self=@_;
print $self;

但这只是给了我somepackage=HASH(somehexnumber)

请告诉我这是否可行,如果是,请执行以下操作。

5 个答案:

答案 0 :(得分:7)

如果没有可怕的hackery(通过堆栈帧查看),这是不可能的。该名称只是对象的引用,它不是对象的一部分。

你正以错误的方式解决问题。或许更多地描述一下?

答案 1 :(得分:2)

我可以想出两种方法来解决你的问题:

  1. 使您对该对象的属性感兴趣的名称
  2. 使用名称作为键
  3. 将对象存储在哈希中

答案 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

如果您使用驼鹿,它也会自动导出。