2010-02-12 4 views
7

해시를 반환하는 메서드가있는 클래스가 있습니다. 일반적으로, 정말 같은 결과를 얻을 것이다 : 반환 된 해시의클래스의 메서드에서 반환 된 해시를 역 참조하려면 어떻게해야합니까?

%resp = $myclass->sub($foo); 

그리고 멤버에의 액세스를 다음과 같이 :

$resp{key}{subkey}; 

을 2 차원 해시의 경우. 나는이 같은 하나의 우아한 라인으로이를 결합하는 방법, 뭔가가 있어야 알

: 코드를 실행하려고 할 때

$myclass->sub($foo)->{key}{subkey} 
분명히

이 펄로 제대로 역 참조되지 않는이를 반환

Can't use string ("1/8") as a HASH ref

"References quick reference" on Perlmonks보고에서, 임의 역 참조 시퀀스를 시도하고, 나는 펄에 대해 불평하지 않는 다음, 함께했다,뿐만 아니라 내가 무엇을 찾고 반환하지 않습니다

,
$%{$myclass->sub($foo)}->{key}{subkey} 

누군가가 마법역 참조 취소 이스케이프 시퀀스가이 작업을 수행 할 것이라고 말할 수 있습니까?

+1

두 개의 완벽하게 좋은 라인을 하나의 엉망인 라인으로 바꾸면 모든 사람이 더 열심히 살고 싶어합니다. 분명히 생각할 좋은 것들이 있습니다. :) –

답변

1

그냥 대신 해시의 hashref를 돌려 :

$myclass->sub($foo)->{key}->{subkey}

+0

-> before {key}와 같은 결과입니다. 감사. – sgsax

+0

같은 결과가 나옵니다. – sgsax

+0

Whazzup with -1? 두 번째 솔루션이 효과를 발휘했습니다. – DVK

2

내가 대신 하위에서 HASH 참조를 반환 할 것입니다. 그렇지 않으면 (아마도) 귀하의 해시는 아무 이유없이 다시 HASH에 다음 LIST로 전환된다 따라서보다 효율적인 참조를 반환 할 때 관여 적은 복사가있다

sub mysub() { 
    ... 
    return \%myhash; 
} 

. 역 참조 바로 다음 sub에 의해 반환 된 목록에서 해시 참조를 만들 것이다

{ $myclass->sub($foo) }->{key}{subkey} 

: 해시 참조가 최고의 작품,하지만 기능을 얻을 수 반환 하위 변경

+2

해시가 배열이 아닌 목록으로 바뀝니다. 구별은 미묘하지만 중요합니다. –

+0

나는 그 일을 할 수있다. 해시 대신 해시 참조를 반환하는 이점을 설명 할 수 있습니까? 수업의 다른 방법들을 쉽게 재 작업 할 수 있습니다. 감사! – sgsax

+0

감사합니다. Eric. 나는 LIST를 쓰려고했으나 오래 동안이었다. 내 Perl은 이제 꽤 녹슬다. – ziya

6

를 찾고 있습니다 it

편집 : 해시 대신 목록에서 해시 참조를 반환하는 이점은 주로 성능 중 하나입니다. hashref의 경우 해시가 한 번 생성 된 다음 액세스됩니다. 목록의 경우 해시가 만들어지고 목록으로 변환 된 다음 다시 만들어지고 역 참조가 적용됩니다. 작은 해시의 경우에는 시간이 너무 많이 걸리지 만 큰 경우에는 런타임에 불필요한 작업입니다. 기본적으로 데이터를 일부 장소에서 목록으로 사용하고 다른 곳에서 해시로 사용할 계획이면 해시를 목록으로 반환하는 것이 좋습니다. 그러나 항상 해시로 사용할 계획이라면 참조를 반환하는 것이 더 명확하고 빠릅니다.

+0

그러면 기존 클래스 코드를 유지하면서 찾고 있던 코드를 가져옵니다. 감사! – sgsax

9

당신이하려는 것은 우아하거나 권장하지 않습니다. 어떻게 든 스칼라 컨텍스트에서 루틴을 호출 할 수 있습니다 (즉, "1/8"이 해당합니다).

해시 참조를 반환합니다.작동하지 않습니다

#!/usr/bin/perl 

package My::Mine; 

use strict; use warnings; 

sub test { 
    my %h = (
     a => { z => 1}, 
     b => { y => 2}, 
    ); 
    return %h; 
} 

package main; 

use strict; use warnings; 

my $class = 'My::Mine'; 

print { $class->test }->{a}{z}, "\n"; 

:

이제 좀 봐. 대신, 당신은해야 할 것 :

print +{ $class->test }->{a}{z}, "\n"; 

을 지금, 그 우아 perldoc -f print을 참조하십시오 (하지가!).

짧은 이야기를 요약하면 해시에 대한 참조를 반환합니다.

새로 생성하는 익명의 해시는 무료가 아닙니다. 또한 해시를 서브 루틴에서 플랫 목록으로 반환하는 데 드는 비용도 없습니다.

+0

여기에 +가 사용되는 이유가 없습니다. 나는 교육에 감사한다. 감사. – sgsax

+3

+1을 분명히 설명하는 +1. 또한 해시 반환에 대한 단점이 하나 더 있습니다. "사본이기 때문에 안전하게 수정할 수 있습니다"라고 생각하면 잘못된 보안 감각을 잃을 수 있습니다. 아직 데이터 구조의 내부는 딥 복제되므로 안전하게 수정할 수 없습니다. – DVK

+2

+는 프린트를 따르는 {...} 구조가 print 메소드의 간접 객체가 아니라는 파서의 힌트입니다. print {sub_returns_a_file_handle()} "과 같은 상황에서 사용됩니다 - 열린 따옴표 앞에 쉼표가 없다는 것에 유의하십시오"; –

0

항상 하위 키 하나를 얻고 싶다면 간단한 서브 루틴을 작성하여 줄을 서서 골프를 치는 것을 잊어 버리십시오. 한 가지 장점은 위생 검사를 쉽게 추가 할 수 있다는 것입니다.

sub get_subkey { 
     my($class, $arg, $key, $subkey) = @_; 

     my $hashref = $class->method($arg); 
     return unless ref $hashref; 

     return $hashref->{$key}{$subkey}; 
     } 
관련 문제