Perl에서 @_의 의미는 무엇입니까?


답변:


118

perldoc perlvar 는 특별한 이름의 Perl 변수 정보를 확인하는 첫 번째 장소입니다.

인용 :

@_: 서브 루틴 내에서 배열 @_은 해당 서브 루틴에 전달 된 매개 변수를 포함합니다.

자세한 내용은 perlvar에서 링크 된 perldoc perlsub (Perl 서브 루틴) 에서 찾을 수 있습니다 .

전달 된 인수는 배열에 표시됩니다 @_.

따라서 두 개의 인수가있는 함수를 호출하면 해당 인수가 $_[0]및에 저장됩니다 $_[1].

배열 @_로컬 배열 이지만 해당 요소는 실제 스칼라 매개 변수의 별칭입니다 . 특히 $ _ [0] 요소가 업데이트되면 해당 인수가 업데이트됩니다 (또는 업데이트 할 수없는 경우 오류가 발생 함).

인수가 함수가 호출 될 때 존재하지 않았던 배열 또는 해시 요소 인 경우 해당 요소는 수정되거나 참조를 가져올 때만 생성됩니다. (Perl의 일부 이전 버전은 요소가 할당되었는지 여부에 관계없이 요소를 생성했습니다.) 전체 배열에 할당하면 해당 별칭이 제거되고 인수는 업데이트되지 않습니다.


감사합니다. 저는 최근에야 perldoc을 확인하는 것에 익숙해 졌고 웹 페이지가 유용하다는 것을 알게되었습니다 : perldoc.perl.org/perlvar.html 이것을 웹에서 시작하는 perl 스텁을 만드는 것은 나쁘지 않았습니다 ... 웹 페이지의 서식은 저에게 많은 도움이됩니다.
aschultz

27

일반적으로 변수를 사용하여 하위에 전달 된 매개 변수를 확장합니다 @_.

sub test{
  my ($a, $b, $c) = @_;
  ...
}

# call the test sub with the parameters
test('alice', 'bob', 'charlie');

이것이 perlcritic 이 옳다고 주장하는 방식 입니다.


2
이것은 내가 동의하지 않는 한 번입니다 perlcritic. 개인적으로 이것이 함수에 가장 적합하다고 생각하지만 메서드의 shift경우 자체 참조에 유용 하고 @_배열의 압축을 풉니 다 . 이것은 이것이 메소드이고 메소드가 특정 매개 변수를 취한다는 것을 분명하게합니다
Joel Berger

나는 아마도 전에 PERLCritic에 대해 알고 있었어야했지만 그렇지 않았습니다. 이 예제에서 사용해 주셔서 감사합니다. 때로 직접 참조하는 내용은 누군가에게 완전히 새로운 것을 배우는 데 도움이 될 수 있습니다.
aschultz

12

에 대한 첫 번째 검색 결과perl @_다음과 같습니다.

@_는 서브에 들어오는 매개 변수의 목록입니다.

또한 동일에 대한 더 길고 자세한 설명이 있습니다.


3
실제로 Google 검색의 첫 번째 조회가 바로이 페이지로 연결됩니다.
Gabriel Southern

... 7 후, 인터넷 시대의 영원. 이것이 제가 첫 번째 결과에 연결하고 관련 부분을 언급 한 이유입니다. Google에만 의존하는 것은 매우 순진 할 것입니다.
Piskvor는

1
사실 수년이 지났지 만 질문에 대한 답변을 얻기 위해 Google이 필요하다는 것을 암시하는 답변을 읽는 것은 여전히 ​​성가신 일입니다. 인터넷 검색의 결과로 답을 읽는 사람에게는 무의미한 정보입니다.
Gabriel Southern

2
예, 검색은 올바른 첫 번째 단계이지만 답변에 검색 지침을 포함 할 필요는 없습니다. 가치를 추가하지 않는 중복 정보이며 누군가가 귀하의 답변에있는 검색 링크를 따라 가면 처음부터 다시 가져 오게되므로 아이러니합니다.
Gabriel Southern

1
모든 답변 😂 너무 심하게 세했다 "는 구글"
오스틴 아담스

11

질문은 Perl에서 @_ 의미하는 것 입니다. 인 한, 그 질문에 대한 대답은, 그 인 $_수단 Perl로, @_유사 의미 그들은을 .

아무도의 중요한 측면 언급 한 것 같다 뿐만 아니라 - 의미를 그들의 .

결과적으로 둘 다 대명사로 사용되거나 때로는 국소화 제로 사용됩니다.

항상 그런 것은 아니지만 일반적으로 명목상의 선행이 있습니다.


7

대부분의 경우 개별 변수에 대해 시프트를 사용할 수도 있습니다.

$var1 = shift;

Perl은 하위 루틴 내부의 외부 정보에 액세스하는 여러 가지 흥미로운 방법을 가지고 있으므로이 주제에 대해 자세히 조사해야합니다.


3
멋지다, 누구든지 비슷한 일을 할 다른 방법을 게시 한 것에 대해 나에게 반대표를 준 사람. 이미 누군가가했기 때문에 질문에 직접 답하지 않았다는 것을 알고 있지만, 새로운 펄 프로그래머가 종종 혼동하는 대체 형식을 제안했습니다.
hockfan86


2

또한 함수가 배열을 반환하지만 반환 된 데이터를 아래와 같은 변수에 할당하지 않고 함수가 호출되는 경우에도 마찬가지입니다. 여기서 split ()이 호출되지만 어떤 변수에도 할당되지 않습니다. 나중에 @_를 통해 반환 된 데이터에 액세스 할 수 있습니다.

$str = "Mr.Bond|Chewbaaka|Spider-Man";
split(/\|/, $str);

print @_[0]; # 'Mr.Bond'

이것은 문자열을 분할 $str하고 배열을 설정합니다 @_.


1

@ 배열에 사용됩니다.

서브 루틴에서 또는 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. 따라서 하위 기능을 편집했습니다.
EverythingRightPlace

0

@_ 변수를 편집하지 마십시오 !!!! 만져서는 안됩니다. 그렇지 않으면 예상치 못한 효과가 나타납니다. 예를 들면 ...

my $size=1234;
sub sub1{
  $_[0]=500;
}
sub1 $size;

sub1을 호출하기 전에 $ size에는 1234가 포함되어 있습니다.하지만 500 (!!) 이후에는이 값을 편집하지 마십시오 !!! 두 개 이상의 값을 전달하고 서브 루틴에서 변경할 수 있으며 모두 변경됩니다! 이 효과가 설명 된 것을 본 적이 없습니다. 내가 본 프로그램도 @_ 배열을 읽기 전용으로 둡니다. 그리고 변수를 안전하게 전달할 수 있도록 내부 서브 루틴을 변경하지 마십시오. 항상 그렇게해야합니다.

sub sub2{
  my @m=@_;
  ....
}

@를 로컬 서브 루틴 프로 시저 변수에 할당하고 다음으로 작업했습니다. 또한 배열을 returun하는 일부 심층 재귀 알고리즘에서이 접근 방식을 사용하여 로컬 변수에 사용되는 메모리를 줄일 수 있습니다. @_ 배열을 동일하게 반환하는 경우에만.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.