2010-08-31 41 views
-1

说我做一个对象如下:如何在Perl中获取对象的名称?

$object22=new somepackage("stuff"); 

,后来我想运行一个像这样的子程序:

$object22->somesubroutine(); 

我想捕捉的子程序字符串“object22”“somesubroutine “。 我想:

[email protected]_; 
print $self; 

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

请让我知道这是可能的,如果这样的代码是什么这样做。

+4

福雷斯特是正确的,你不能这样做,你不想。你想用这个完成什么? – Schwern 2010-08-31 03:05:09

+0

你想做什么?这是创建类/对象概念的原因之一。 – vol7ron 2010-08-31 03:08:20

+0

谢谢你节省我的时间。我正在使用此对象从模板中编写输入文件。每个对象本质上都包含要搜索的字符串,用于替换这些字符串的字符串以及用于查找的文本文件。当然,子例程也可以执行所有这些操作。我想组织生成的输入文件。我认为要做到这一点比将输入文件存储在创建它们的对象后面的目录中更好。我打算将这些输入文件发送给读取它们并创建输出文件的程序,以便我可以将所有这些文件存储在一个很好命名的目录中。 – Feynman 2010-08-31 04:28:09

回答

7

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

您以错误的方式处理问题。也许更多地描述它?

+0

感谢您节省时间。我正在使用此对象从模板中编写输入文件。每个对象本质上都包含要搜索的字符串,用于替换这些字符串的字符串以及用于查找的文本文件。当然,子例程也可以执行所有这些操作。我想组织生成的输入文件。我认为要做到这一点比将输入文件存储在创建它们的对象后面的目录中更好。我打算将这些输入文件发送给读取它们并创建输出文件的程序,以便我可以将所有这些文件存储在一个很好命名的目录中。 – Feynman 2010-08-31 04:27:39

1

这可能与可怕的hackery爬过堆栈帧。可能是类似PadWalker

但是你可能接近错误的问题。

+0

谢谢你节省我的时间。我正在使用此对象从模板中编写输入文件。每个对象本质上都包含要搜索的字符串,用于替换这些字符串的字符串以及用于查找的文本文件。当然,子例程也可以执行所有这些操作。我想组织生成的输入文件。我认为要做到这一点比将输入文件存储在创建它们的对象后面的目录中更好。我打算将这些输入文件发送给读取它们并创建输出文件的程序,以便我可以将所有这些文件存储在一个很好命名的目录中。 – Feynman 2010-08-31 04:29:11

+1

这与我的回答非常相似... o.O – 2010-08-31 23:02:54

2

我能想到的两种方法来解决你的问题:

  1. 使名称你感兴趣的对象
  2. 店在哈希你的对象的属性,使用名称关键

保罗

1

使用堆栈帧的方法是使用caller()获得行你的日常是CAL然后读取程序文件并获取变量名称。

#!/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用于库等。