문제

나는 다음과 같이 추천을하고 있습니다.

use strict;
use warnings;

sub repl {
    local *line = \$_[0]; our $line;
    $line = "new value";
}

sub doRepl {
    my ($replFunc) = @_;
    my $foo = "old value";
    $replFunc->($foo);
    print $foo; # prints "new value";
}

doRepl(\&repl);

더 깨끗한 방법이 있습니까?

기능 참조를 사용하고 있기 때문에 프로토 타입이 작동하지 않습니다 (함수 참조를 사용해야 할 좋은 이유가 있음을 믿어).

나는 또한 사용하고 싶지 않습니다 $_[0] 모든 곳에서 repl 추악하기 때문입니다.

도움이 되었습니까?

해결책

당신은 보셨습니까? 데이터 :: 별명? 깨끗한 구문으로 어휘 스코핑 된 별칭을 만들 수 있습니다.

이를 사용하여 다음과 같은 추천 시맨틱을 만들 수 있습니다.

use strict;
use warnings;

use Data::Alias;

sub foo {
    alias my ($arg) = @_;
    $arg++;
}

my $count = 0;

foo($count);

print "$count\n";

출력은입니다 1, 호출을 나타냅니다 foo 논쟁을 수정했습니다.

다른 팁

 

sub repl {
    my $line = \$_[0];     # or: my $line = \shift
    $$line = "new value";
}

이 작업을 수행하는 몇 가지 방법이 있습니다. 스칼라 참조를 명시 적으로 전달하십시오 $foo, 또는 참조 시맨틱으로 Perl의 내장 패스를 활용하십시오.

명시 적 참조 :

my $foo = "old value";
doRepl( \&repl, \$foo );
print $foo; # prints "new value";

sub repl {
    my $line = shift;
    $$line = "new value";
}

sub doRepl {
    my ($replFunc, $foo) = @_;
    $replFunc->($foo);
}

참조로 통과 :

my $foo = "old value";
doRepl( \&repl, $foo );
print $foo; # prints "new value";

sub repl {
    $_[0] = "new value";
}

sub doRepl {
    my $replFunc = shift;
    $replFunc->(@_);
}

참조별로 더 좋은 패스 :

my $foo = "old value";
doRepl( \&repl, $foo );
print $foo; # prints "new value";

sub repl {
    $_[0] = "new value";
}

sub doRepl {
    my $replFunc = shift;
    &$replFunc;
}

첫 번째는 정상적인 perl 하드 참조를 사용하여 작업을 수행합니다.

첫 번째 Pass By Ref 메소드는 Perl이 모든 기능에 인수를 참조로 전달한다는 사실을 사용합니다. 의 요소 @_ 서브 루틴이 호출 될 때 실제로 인수 목록의 값에 대한 별명입니다. 변경하여 $_[0] 안에 foo(), 당신은 실제로 첫 번째 주장을 변경합니다 foo().

두 번째 Pass by ref 메소드는 서브가 & Sigil과 No Parens는 @_ 발신자 배열. 그렇지 않으면 동일합니다.

업데이트: 방금 당신이 피하고 싶다는 것을 알았습니다 $_[0]. 원하는 경우 대체로 할 수 있습니다.

sub repl {
    for my $line( $_[0] ) {
        $line = 'new value';
    }
}

나는 사용에 문제가 있다고 생각하지 않습니다 local 이 경우 별명을 생성합니다.

Dynamic Scope는 물론 강력한 기능이지만 부작용을 알고있는 한 (새로운 값은 스코프에서 호출되는 함수에서 볼 수 있습니다. 같은 이름의 어휘가 범위에 있으면 국소화 할 수 없습니다. ...) 그런 다음 이미 넘쳐나는 Perl Toolbox에 유용한 추가 기능입니다.

Perl Docs의 경고의 주된 이유 local 사람들이 우연히 사용하는 대신 사용하는 것을 막아야합니다. my 그리고 Perl4의 전환을 용이하게합니다. 그러나 분명히 때가 있습니다 local 유용하고 이것은 하나입니다.

사용 for 당신의 별칭을 만들려면 옵션이지만 명시 적 구문을 찾습니다. local 의도가 더 명확합니다. 성능이 우려되면 조금 더 빠릅니다.

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