@_
Perl에서 의 의미는 무엇입니까 ?
답변:
perldoc perlvar 는 특별한 이름의 Perl 변수 정보를 확인하는 첫 번째 장소입니다.
인용 :
@_
: 서브 루틴 내에서 배열@_
은 해당 서브 루틴에 전달 된 매개 변수를 포함합니다.
자세한 내용은 perlvar에서 링크 된 perldoc perlsub (Perl 서브 루틴) 에서 찾을 수 있습니다 .
전달 된 인수는 배열에 표시됩니다
@_
.따라서 두 개의 인수가있는 함수를 호출하면 해당 인수가
$_[0]
및에 저장됩니다$_[1]
.배열
@_
은 로컬 배열 이지만 해당 요소는 실제 스칼라 매개 변수의 별칭입니다 . 특히 $ _ [0] 요소가 업데이트되면 해당 인수가 업데이트됩니다 (또는 업데이트 할 수없는 경우 오류가 발생 함).인수가 함수가 호출 될 때 존재하지 않았던 배열 또는 해시 요소 인 경우 해당 요소는 수정되거나 참조를 가져올 때만 생성됩니다. (Perl의 일부 이전 버전은 요소가 할당되었는지 여부에 관계없이 요소를 생성했습니다.) 전체 배열에 할당하면 해당 별칭이 제거되고 인수는 업데이트되지 않습니다.
일반적으로 변수를 사용하여 하위에 전달 된 매개 변수를 확장합니다 @_
.
sub test{
my ($a, $b, $c) = @_;
...
}
# call the test sub with the parameters
test('alice', 'bob', 'charlie');
이것이 perlcritic 이 옳다고 주장하는 방식 입니다.
perlcritic
. 개인적으로 이것이 함수에 가장 적합하다고 생각하지만 메서드의 shift
경우 자체 참조에 유용 하고 @_
배열의 압축을 풉니 다 . 이것은 이것이 메소드이고 메소드가 특정 매개 변수를 취한다는 것을 분명하게합니다
@
배열에 사용됩니다.
서브 루틴에서 또는 Perl에서 함수를 호출 할 때 매개 변수 목록을 전달할 수 있습니다. 이 경우 @_
is를 사용하여 매개 변수 목록을 함수에 전달할 수 있습니다.
sub Average{
# Get total number of arguments passed.
$n = scalar(@_);
$sum = 0;
foreach $item (@_){
# foreach is like for loop... It will access every
# array element by an iterator
$sum += $item;
}
$average = $sum / $n;
print "Average for the given numbers: $average\n";
}
Average(10, 20, 30);
위의 코드를 살펴보면 다음 foreach $item(@_)
줄을 참조하십시오 . 여기에서 입력 매개 변수를 전달합니다.
use strict
. 따라서 하위 기능을 편집했습니다.
@_ 변수를 편집하지 마십시오 !!!! 만져서는 안됩니다. 그렇지 않으면 예상치 못한 효과가 나타납니다. 예를 들면 ...
my $size=1234;
sub sub1{
$_[0]=500;
}
sub1 $size;
sub1을 호출하기 전에 $ size에는 1234가 포함되어 있습니다.하지만 500 (!!) 이후에는이 값을 편집하지 마십시오 !!! 두 개 이상의 값을 전달하고 서브 루틴에서 변경할 수 있으며 모두 변경됩니다! 이 효과가 설명 된 것을 본 적이 없습니다. 내가 본 프로그램도 @_ 배열을 읽기 전용으로 둡니다. 그리고 변수를 안전하게 전달할 수 있도록 내부 서브 루틴을 변경하지 마십시오. 항상 그렇게해야합니다.
sub sub2{
my @m=@_;
....
}
@를 로컬 서브 루틴 프로 시저 변수에 할당하고 다음으로 작업했습니다. 또한 배열을 returun하는 일부 심층 재귀 알고리즘에서이 접근 방식을 사용하여 로컬 변수에 사용되는 메모리를 줄일 수 있습니다. @_ 배열을 동일하게 반환하는 경우에만.