문제

그래서 나는 이것을 알지 못했고 그것에 대해 약간의 명확한 것을 얻고 싶습니다. 당신이 그렇게하는지 알고 있습니다

foreach (@list){

해당 루프에서 $ _를 변경하면 실제 데이터에 영향을 미칩니다. 하지만 당신이 그랬다면

foreach my $var1 (@list){

루프에서 $ var1을 변경하면 실제 데이터가 변경됩니다. :-/ 그래서 @list를 고리하지만 변수를 읽기 전용 사본으로 유지하는 방법이 있습니까?

도움이 되었습니까?

해결책

$var 각 항목과 차례로 별명이 있습니다.

보다 http://perldoc.perl.org/perlsyn.html#foreach-loops

목록의 모든 요소가 LValue 인 경우 루프 내부에서 Var를 수정하여 수정할 수 있습니다. 반대로, 목록의 요소가 lvalue가 아닌 경우 해당 요소를 수정하려는 시도는 실패합니다. 다시 말해, Foreach Loop Index 변수는 반복되는 목록의 각 항목에 대한 암시 적 별명입니다.

다른 팁

가장 쉬운 방법은 복사하는 것입니다.

foreach my $var1 (@list) {
    my $var1_scratch = $var1;

또는

foreach my $var1 ( map $_, @list ) {

그러나 $ var1이 참조 인 경우 $ var1_scratch는 같은 것을 참조 할 것입니다. 정말 안전하려면 STOREABLE :: DCLONE과 같은 것을 사용해야합니다.

foreach my $var1 ( @{ Storable::dclone( \@list ) } ) {
}

(테스트되지 않은). 그런 다음 $ var1을 안전하게 변경할 수 있어야합니다. 그러나 @list가 큰 데이터 일프 구조라면 비용이 많이들 수 있습니다.

참조가 아니라 별칭입니다. 자신의 별칭을 만들고 싶다면 (외부) 사용할 수 있습니다. 데이터 :: 별명.

이 루프들 사이의 유일한 차이점 :

foreach (@array) { ... }
foreach my $var (@array) { ... }

루프 변수입니다. 별칭은의 함수입니다 foreach, 암시 적 변수가 아닙니다 $_. 이것은 an입니다 별명 (같은 것을위한 또 다른 이름) 참조 (사물에 대한 포인터).

간단한 (그리고 일반적인) 사례에서는 사본을 만들어 별칭을 깨뜨릴 수 있습니다.

foreach my $var (@array) {
    my $copy = $var;
    # do something that changes $copy
}

이것은 일반적인 스칼라 값에 적용됩니다. 참조 (또는 개체)의 경우, 당신은 저장 가능 또는 클론, 비쌀 수 있습니다. 묶인 변수도 문제가 있습니다. Perlsyn 상황을 완전히 피하는 것이 좋습니다.

Foreach 문자 자체에서 변수를 강제로 값으로 강요하는 방법을 모르겠습니다. 값을 복사 할 수 있습니다 $_ 그렇지만.

#!/usr/perl/bin
use warnings;
use strict;

use Data::Dumper;

my @data = (1, 2, 3, 4);

print "Before:\n", Dumper(\@data), "\n\n\n";

foreach (@data) {
    my $v = $_;
    $v++;
}

print "After:\n", Dumper(\@data), "\n\n\n";

__END__

for 문에서 @list 사본을 작성하십시오.

foreach my $var1 (() = @list) {
  # modify $var without modifying @list here
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top