2009-02-02 2 views

답변

15

수 있습니다. 그것들은 재미 있고 모든 것이지만, 모든 서브가 어떻게 작동하는지에 대한 가정을하는 새로운 사용자를 혼란스럽게합니다. 따라서 더 나은 방법이있을 때 코드에서 피해야합니다.

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

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

여기에서 차이가있는 대부분의 전자가 대신 그것을 사용, 훨씬 더 많은 표현력을 한 코드에 위임 동작과 같이

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

그러나,이 같은 일을 기능 자체. 예를 들어

:

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

조금 불쾌한

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

을 수행 할 필요합니다.

$ x를 사용하여 해당 대체를 수행할지 여부를 소급하여 (substr이 LValue 하위이므로) 문자열을 수정할지 여부를 생각해야하기 때문에 여기에 더 불쾌한 점이 있습니다. 나는 그렇게 생각하지 않는다. 그러나 그것의 모호한 점은 매뉴얼이 그것이 있는지 아닌지를 기억해야한다. 그리고 그것은 나쁘다.

+2

$ x에는 lvalue가 아닌 복사본이 포함되어 있습니다. 그러나 (substr (...)) {'또는'foo (substr (...)) '에 대해 lvalue substr ala'를 별칭으로 지정하면 lvalue로 둘 이상의 작업을 수행 할 수 있습니다. – ysth

+0

일부 구문을 이해하는 데 어려움이 있습니다. A) "LValue 결과를 사용하여 더러운 작업을 수행합니다." 예제에서 ilustrated를 볼 수 없습니다. 또는 "LValue result"B)가 "함수 자체 대신에 그것을 사용하는 코드에 동작을 위임 할 때 당신이 의미하는 바를 이해하지 못합니다." 어쩌면 그것은 비영어권 인 것에 대한 것이지만 여기서 대명사의 의미에 대해 혼란스러워합니다. –

+0

및 C) "$ x를 사용하여 해당 대체를 수행할지 여부를 소급하여 문자열을 수정할지 여부를 생각해야하기 때문에"- 나에게 너무 불분명하다면 정확하게 정확히 어떻게 될지조차 알 수 없다. –

7

그들은 다른 인터페이스를 제공하기 때문에 어떤 상황에서는보다 직관적 일 수 있습니다. 기존의 setter와 달리 실제로 값을 직접 변경할 수 있습니다. 예를 들어

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

는 LValues는 피해야하는 것이 좋습니다 청소기에 비해

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

당신은 객체 회원 세터로 잠수함을 좌변 사용할 수 있습니다

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

을 그리고 나중에 :

$foo->x = 5; 

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

직관적이지만 취약 함; $ foo가 어떻게 구현되는지를 바꾸면 어떨까요?

$foo->{x} = 5; 

전통적인 세터 방법;

물론
$foo->set_x(5); 

, 좌변 방법이 정말 펄 커뮤니티에서 채택 된 적이 있고, 좌변 잠수정의 사용이 "이상한"이고 무엇을 위해 얻은 것 : 할당 금액 것에 대해 할당 구문을 사용하지 않습니다 직관력은 그것의 모든 기이함에 의해 상실 될 것입니다.

+1

[manual] (https://perldoc.perl.org/perlsub.html#Lvalue-subroutines) 상태와 마찬가지로, lvalue subs를 사용하여 이와 같은 설정자는 입력의 유효성을 검사 할 가능성을 배제합니다. 즉, 접근 자로서 lvalue 서브를 사용하는 것이 일반 메소드보다 덜 강력합니다. –

6

필자가 사용하는 일반 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; 

,이 기능은 전체 생태계에서 많이 사용되지 않지만, 적어도이 틈새 시장에서의 사용은 PDL의 사용자를위한 많은 쉽게 생활 한다.

+0

나는 당신의 첫 번째 대답을 upvote했다! –

관련 문제