2010-08-31 40 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用於庫等。