Как я могу получить название объекта в Perl? - PullRequest
0 голосов
/ 31 августа 2010

Скажите, что я делаю объект следующим образом:

$object22=new somepackage("stuff");

и позже я хочу запустить подпрограмму, подобную этой:

$object22->somesubroutine();

Я хотел бы захватить строку «object22» в подпрограмме «somesubroutine». Я попробовал:

$self=@_;
print $self;

но это просто дало мне somepackage=HASH(somehexnumber)

Пожалуйста, дайте мне знать, если это возможно, и если да, то каков код для этого.

Ответы [ 5 ]

7 голосов
/ 31 августа 2010

Это невозможно без ужасного взлома (просматривая кадры стека). Имя - это просто ссылка на объект, оно не является частью объекта.

Вы подходите к проблеме неправильно. Возможно, опишите это больше?

2 голосов
/ 31 августа 2010

Я могу придумать два способа обойти вашу проблему:

  1. сделать интересующее вас имя атрибутом объекта
  2. сохранить ваши объекты вхеш, используя имя в качестве ключа

Пол

1 голос
/ 31 августа 2010

Альтернативой использованию фреймов стека является использование 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 и т. Д.

1 голос
/ 31 августа 2010

Это возможно при ужасной хакерской атаке, которая ползет по фреймам стека.Что-то вроде PadWalker, возможно.

Но вы, вероятно, подходите к проблеме неправильно.

0 голосов
/ 21 октября 2014

Вызов «благословенный»: https://metacpan.org/pod/Scalar::Util#blessed.

Он также экспортируется автоматически, если вы используете лося.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...