2017-12-01 1 views
1

제가 물어 보려고하는 것은 쉽게 나타납니다.

$foo라는 이름의 변수로 문자열 일치 $a[0] 가능하다

my ($foo, $bar) = (0,0); 

my @a = ("foo","bar","beyond","recognition"); 

라는 이름이 개 변수를 상상하고 ("안녕하세요"라고)이 에 값을 할당 일치하는 경우에만?

(내 제품이 아님) 코드를 디버깅하려고하는데 힘든 부분에 부딪 혔습니다. 기본적으로 스크립트의 일부에는 여러 변수가 있습니다.

my ($p1, $p2, $p3, $p4)= (0,0,0,0); # *Edited* 
my @ids = ("p1","p2","p3","p4") 

루프 내에서 특정 작업을 호출하기 위해 이러한 각 변수를 해시 키로 전달해야하는 경우가 있습니다. 루프의 첫 번째 반복에 대한

for (0..3){ 
    my $handle = get_my_stuff(@ids); 
    my $ret = $p1->do_something(); # <- $p1 is used for the first instance of loop. 
    ... 
    ... 
    ... 
} 

, 나는 $p1를 사용해야하지만 루프의 두 번째 반복을 위해 내가했던이었다 그래서

 my $ret = $p2->do_something(); # not $p1 

을 통과 (또는 전화) 할 필요가;

my $p; 
for (1..4){ 
    my $handle = get_my_stuff(@ids); 
    no strict 'refs'; 
    my $ret = $p{$_}->do_something(); 
    ... 
    ... 
    ... 
    use strict 'refs'; 
    ... 
    } 

그러나 위의 작업이 허용되지 않습니다, 나는 그것이 나오는 것에 따라. :(방식으로 내 키를 호출 할 수 없습니다 생각은, $의 P1은 즉시 get_my_stuff()가. 그리고에 호출 된 후에 축복받은 해시되었다 내 가장 놀라운, (너무 많은 여기에 붙여 넣기하는 데 시간이 너무 오래) 할당을하거나 일치하는 경우에만 내 변수에 해시 참조를 전달하는 기능 에서 어떻게 든 스크립트.

+0

'내 ($ P1, $ P2, $ P3, $ P4) = 0 × 4;'$의 p1' 설정 뜻' "0000" '및 다른 모든 것들은'undef'에요. '$ p {$ _} -> ...'는'$ p'가 아니라'% p'를 가리 킵니다. 마지막 코드 블록은 의미가 없습니다. 그래서'$ p1' 등은 객체입니다. 그리고'get_my_stuff'는 이름들의리스트를 취하고, 그 이름들에 대응하는 객체들의리스트를 반환합니다. 왜 그걸 목록에서 불러내나요? – simbabque

+0

그건 내 실수 였어. 나는'($ p1, $ p2, $ p3, $ p4) = (0,0,0,0); '을 할 의도였습니다. 원래 코드가 작성된 것과 비슷하게 유지하려고했습니다. var 이름 만 변경했습니다. – YouHaveaBigEgo

+1

질문을 수정하고 수정하십시오. 실제 코드를 표시하지 않거나 실행을 테스트 한 코드가 적어도 [mcve]라면 원하는 용도로 사용할 수 없습니다. – simbabque

답변

5

당신은 뭔가를 발명하려고 할 필요가 없습니다 해쉬를 사용하는 것은 맞지만 접근법에 결함이 있습니다.

당신의 함수 인 get_my_stuff은 인수 목록을 가져 와서 어떻게 든 변형시킵니다. 그런 다음 인수에 해당하는 객체 목록을 반환합니다. 루프에서 그 작업을 수행하는 대신 숫자를 반복하고 각 ID를 객체에 할당하여 해시를 작성하기 전에 수행하십시오.

Perl을 사용하면 해시 조각에 할당 할 수 있습니다. 이 경우 은 @으로 변경됩니다. 아래의 구현에서는 DateTime을 사용하여 객체가 다른 것을 보여줍니다.

use strict; 
use warnings; 
use feature 'say'; 
use DateTime; 

# for illustration purposes 
sub get_my_stuff { 
    return map { DateTime->new(year => (substr $_, 1) + 2000) } @_; 
} 


my @ids = qw(p1 p2 p3 p4); 
my %p; 

# create this outside of the loop 
@p{@ids} = get_my_stuff(@ids); 

foreach my $i (1.. 4) { 
    say $p{'p' . $i}->ymd; # "do_something" 
} 

이 출력 할

2001-01-01 
2002-01-01 
2003-01-01 
2004-01-01 
+1

감사합니다. 이것은 굉장하다 :). 네가 그 일을 할 수 있다는 것을 나는 몰랐다. 펄 – YouHaveaBigEgo

관련 문제