foreach my $ var (@list) - $ var는 참조입니까?
문제
그래서 나는 이것을 알지 못했고 그것에 대해 약간의 명확한 것을 얻고 싶습니다. 당신이 그렇게하는지 알고 있습니다
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
}