문제

LValue 서브 루틴의 사용이 무엇인지 이해가 안 돼요? 정상적인 서브 루틴으로 달성 할 수없는 것은 무엇입니까? 몇 가지 예를 게시 해 주시겠습니까?

감사

도움이 되었습니까?

해결책

lvalues는 피하는 것이 좋습니다. 그들은 재미 있고 전부이지만 모든 서브의 작동 방식에 대해 가정하는 새로운 사용자를 혼동하므로 더 나은 방법을 사용할 수있을 때 코드로 피해야합니다.

때로는 더러운 작업을 수행하기 위해 LValue 결과를 사용하는 것이 매우 실용적 일 수 있습니다.

substr( $string, $start, $stop ) = 'somevalue' # replaces the specified part of the substring. 

그러나 이것은 또한 같은 일을합니다.

substr( $string, $start, $stop , 'somevalue' ); 

여기서 전자의 차이는 대부분 기능 자체 대신에 사용하는 코드에 동작을 위임하기 때문에 훨씬 더 표현력이 뛰어납니다.

예를 들어:

substr( $string, $start, $stop ) =~ s/a/b/g 

당신이해야 할 것입니다

my $x = substr( $string, $start, $stop ); 
$x =~ s/a/b/g/; 
substr( $string, $start, $stop, $x );

약간 불쾌합니다.

비록 여기에는 추가 불쾌한 것이 있습니다. 왜냐하면 당신은 그 대체를 수행하는지 아닌지에 대해 생각해야하기 때문에 문자열을 수정하기 위해 소급으로 작동하는지 여부를 생각해야하기 때문입니다 (substr이 lvalue sub이기 때문에). 나는 그것이 그렇게 생각하지 않지만, 그 모호한 것은 매뉴얼을 확인하여 그것이 그렇는지 여부를 기억해야하며, 그것은 나쁘다.

다른 팁

객체 멤버의 세터로 lvalue subs를 사용할 수 있습니다.

sub x : lvalue {
    my $self = shift;
    $self->{x};
}

그런 다음 나중에 :

$foo->x = 5;

이는 나중에 객체가 구현되는 방식을 변경하려는 경우 회원의 직관성을 세터를 캡슐화하는 유연성과 직접 설정합니다. Perl에서 회원을 설정하는 다음과 같은보다 전통적인 방법과 비교하십시오.

직관적이지만 깨지기 쉬운; $ foo가 구현되는 방식을 변경하면 어떻게됩니까?

$foo->{x} = 5;

전통적인 세터 방법; 과제에 대한 금액에 대해 할당 구문을 사용하지 않습니다.

$foo->set_x(5);

물론, LValue 방법은 Perl 커뮤니티에 의해 실제로 받아 들여지지 않았으며, lvalue subs의 사용은 "이상한"것이며 직관을 위해 얻을 수있는 것은 그 이상으로 인해 상실 될 것입니다.

어떤 상황에서는 더 직관적 일 수 있다는 다른 인터페이스를 제공합니다. 기존 세터와 달리 실제로 값을 직접 변경할 수 있습니다. 예를 들어

lvalue_sub($foo) =~ s/foo/bar/;

보다 깨끗할 수 있습니다

my $tmp = some_sub($foo);
$tmp =~ s/foo/bar/;
some_sub($foo, $tmp);

나는 정상적인 Perl 물건에서 그것들을 많이 사용하는 것에 대해 말할 수 없지만, 슬라이스 또는 다른 하위 하위 섹션을 복용 할 때 Perl 데이터 언어에서 광범위하게 사용됩니다. 예를 들어:

my $a = sequence(100);
# use lvalue in this increment:
$a->where($a < 10)++;

# Zero-out the last four elements
# notice the use of the overloaded .= operator:
$a->slice("-10:") .= 0;

Perl의 많은 것들과 마찬가지로이 기능은 전체 생태계에서 많이 사용되지 않지만 적어도이 틈새 시장에서는 사용이 생명을 만듭니다. 많이 PDL 사용자가 더 쉽습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top