나는 그것이 당신이 성취하고자하는 것에 달려 있다고 생각합니다. 이것은 다음과 같이 느껴질 것입니다. XY Problem
#!/usr/bin/env perl
use strict;
use warnings;
package MyObject;
sub new {
my ($class, %args) = @_;
my $self = {};
$self->{args} = \%args;
bless $self, $class;
return $self;
}
sub get_value {
my ($self, $attribute) = @_;
return $self -> {args} -> {$attribute};
}
package main;
my $object = 'MyObject'->new(test => 'frobnicated', foo=>'bar');
print $object -> get_value('test');
그리고 메소드 자체에서 동적 비트를 처리하십시오. 당신이 코드 참조 얻기 위해 can
방법을 사용할 수있는 서브 루틴 '발견'할 경우
그러나 :
my $methodname = 'get_value';
if (my $coderef = $object -> can($methodname)) {
print $coderef -> ($object,'foo');
}
잘 모르겠어요를 this'd 일반적으로 좋은 일이 될 일을 할 그래도 꽤 지저분해질 수 있습니다. 나는이 접근법이 eval보다 무작위로 깨지기 어렵다고 생각한다.
그러나 원래의 접근 방식 는 작동합니까 : 나는 당신의 서브 erroring되는 것 같아요
my $value = eval '$object->$methodname("foo")';
print $value,"\n";
을 - 당신이 eval
의 리턴 코드가 [email protected]
을 확인 시도?
여기서 실제로 무엇을하려고합니까? 왜 동적 인 하위 이름을 지정하려고합니까? 좀 더 일반적인 방법은'$ object -> get_value ($ some_attribute_name)'또는 이와 비슷한 것이다. 이것은 [XY 문제] (http : //meta.stackexchange.com/questions/66377/what-is-the-xy-problem) – Sobrique
그게 효과가있다. 실제 코드가 보이지 않습니다. – simbabque
잘 찾아 냈습니다. 나는 문제가 없다는 것을 깨닫기 전에 문제를 찾아 나서고 갔다. – Sobrique