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


68

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

97

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

인용 :

@_을 : 서브 루틴 내에서 배열 @_ 그 루틴에 전달 된 파라미터를 포함한다.

자세한 내용은 perlvar에서 링크 perldoc perlsub (Perl subroutines)에서 찾을 수 있습니다 다음 배열 @_에서 쇼까지 전달

인수를.

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

배열 @_로컬 배열이지만, 그 요소 실제 스칼라 파라미터에 대한별명. 요소 $ _ [0]이 (가) 업데이트되면 해당 인수가 업데이트됩니다 ( 업데이트 할 수없는 경우 오류가 발생 함). 소자 (그리고 경우) 가 수정되는 경우에만 생성되거나 그것에 참조 이 수행되는 것을

인수 함수가 호출 될 때 존재하지 않았다 배열 또는 해시 소자이면

. 일부 최신 버전의 Perl 은 요소가 할당되었는지 여부에 관계없이 해당 요소를 만들었습니다. 에 할당하면 @@ 배열 전체가 앨리어싱을 제거하고 인수를 업데이트하지 않습니다.

  0

고마워, 나는 최근에 perldoc을 확인하는 것에 익숙해졌고, 나는 웹 페이지가 유용하다는 것을 발견했다. http://perldoc.perl.org/perlvar.html이 작업을 시작한 perl 스텁을 만드는 것은 나쁘지 않았다. 웹 ... 웹 페이지의 형식이 많이 도움이됩니다. 04 dec. 162016-12-04 07:21:06


8

첫 번째 히트 this 말한다 :

@_가 하위로 들어오는 매개 변수의 목록입니다.

또한 더 길고 자세한 설명이 있습니다.

  0

실제로 Google 검색의 첫 번째 조회수가 바로이 바로 가기 페이지로 연결됩니다. 14 aug. 172017-08-14 22:14:55

  0

... 7 * years * 나중에, 인터넷 시간에 영원. 그래서 나는 둘 다 첫 번째 결과에 연결하고 관련 부분을 qouted : Google 혼자에 따라 매우 순진합니다. 14 aug. 172017-08-14 22:16:58

  0

사실 사실 수년이 지났지 만, 질문에 대한 답변을 Google에 알려야한다는 대답을 읽는 것은 여전히 ​​성가시다. 인터넷 검색의 결과로 답을 읽는 사람에게는 의미없는 정보입니다. 14 aug. 172017-08-14 22:21:53

  0

나는 동의하지 않는다. "질문을하기 전에 * 문제를 검색하십시오."여전히 0 단계입니다. https://stackoverflow.com/help/how-to-ask 아마 * 당신 *에게 성가시다. * 먼저 기계를 조회하여 응답 할 수 있습니다. 14 aug. 172017-08-14 22:32:43

  0

예 검색이 정확한 첫 번째 단계이지만 답안을 검색하는 지침을 포함 할 필요는 없습니다. 그것은 부가 가치가없는 중복 정보이며, 누군가가 귀하의 답변에서 검색 링크를 따라 가면 그들이 시작한 곳으로 되돌아 오기 때문에 아이러닉합니다. 14 aug. 172017-08-14 22:49:12

  0

이중화로 살아가는 법을 배우십시오. 그러면 세계는 중복되고 중복됩니다. 또한, 당신은 1. 편집과 2.wrong을 제안하는 것이 자유 롭습니다. 정답뿐만 아니라 그 출처도 포함하기 때문에 다시 돌려 보내지 않습니다. 14 aug. 172017-08-14 22:52:31

  0

그리고 btw, 네, 그래서 중복을 줄이기로되어있었습니다. 얼마나 잘 * 갔는지 알아? 왜 그런가? ** 사용자가 UTFG에 먼저 신경을 쓸 수 없거나 SO가 이미 동일한 질문을 가지고 있는지 확인할 수 없기 때문에 ** - 우리가 지금 주장하는 것과 동일한 Google 검색은 상단에 네 개의 거의 동일한 SO 응답을 가지고 있습니다 . 중복 중복성. 14 aug. 172017-08-14 22:55:45


5

모든 펄의 "특수 변수"는 perlvar 설명서 페이지에 나와 있습니다.


20

일반적으로, 당신은 @_ 변수를 사용하여 하위에 전달 된 매개 변수를 확장하는 방식이 perlcritic으로 올바른 주장이다

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

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

합니다.

  0

이것은'perlcritic'에 동의하지 않는 한 번이나 개인적으로 이것은 함수에 가장 적합하다고 생각합니다. 그러나 메소드의 경우 자체 참조를'shift '하고 나서'@ _' 배열을 푸는 것이 유용합니다. 이것은 이것이 메서드이고 메서드가 특정 매개 변수를 사용한다는 것을 분명히합니다. 09 may. 112011-05-09 14:25:19

  0

이전에는 PERLCritic에 대해 사용했거나 알고 있어야했지만 그렇지 않았습니다. 이 예제에서 사용해 주셔서 감사합니다. 당신이 비공식적으로 참조하는 것들은 누군가가 그들에게 완전히 새로운 것을 배우도록 도울 수 있습니다. 04 dec. 162016-12-04 07:22:33


5

또한 대부분의 경우 개별 변수에 대한 변화를 사용할 수 있습니다

$var1 = shift; 

이는 펄이 서브 루틴 내부에 외부 정보에 접근하는 흥미로운 방식의 번호를 가지고 당신이 더 연구해야하는 주제이다.

+3

멋지다. 나에게 비슷한 일을하는 다른 방법을 게시하기 위해 간단히 투표를했다. 나는 누군가가 이미했기 때문에 내가 직접 질문에 답하지 않았 음을 알았지 만 새로운 펄 프로그래머가 종종 혼란스럽게하는 대안적인 형태를 제안했다. 14 feb. 112011-02-14 02:59:56


7

질문은 무엇입니까 @_을 의미합니다. 이 질문에 대한 답은 $_을 의미하고 Perl에서는을 의미하고, 마찬가지로 @_은 을 의미합니다.

아무도이 의 중요한 측면을 언급 한 것으로 보이며, 의 의미는뿐입니다.

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

일반적으로 이들은 항상 명목상의 선행사를 사용합니다.


1

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

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

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

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


1

@은 어레이에 사용됩니다.

서브 루틴이나 Perl에서 함수를 호출 할 때 매개 변수 목록을 전달할 수 있습니다. 위의 코드를 관찰하면, foreach $item(@_) 라인을 참조

Average(10, 20, 30); 

여기에 ...

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"; 
} 

함수 호출을 :이 경우에 @_은 함수에 매개 변수 목록을 전달하는 데 사용할 수있다 입력 매개 변수를 전달합니다.

  0

항상 '엄격한 사용'을해야합니다. 그러므로 하위 기능을 편집했습니다. 23 jul. 142014-07-23 15:49:27


0

@ variable_! 그들은 손대지 않아야합니다 .. 또는 당신은 어떤 의심 할 여지없는 효과를 얻습니다. 예를 들어 ...

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

호출하기 전에 sub1 $ 크기는 1234입니다.하지만이 값을 편집하지 마십시오 !!! 두 개 이상의 값을 전달하고 서브 루틴에서 값을 변경하면 모든 값이 변경됩니다! 나는이 효과가 묘사 된 것을 본 적이 없다. 내가 본 프로그램은 @_ 배열을 읽기 전용으로 놔둔다. 그리고 당신은 안전하게 변수를 전달할 수 있습니다 만하는 내부 당신은 항상 그렇게해야한다 서브 루틴 변경되지 않는 : 지역 서브 루틴 프로 시저 변수

sub sub2{ 
    my @[email protected]_; 
    .... 
} 

할당을 @_하고 다음 그들과 함께 일했다. 또한 어레이를 다시 실행하는 일부 깊은 재귀 알고리즘에서이 방법을 사용하여 로컬 변수에 사용되는 메모리를 줄일 수 있습니다. @ _ 배열을 반환하는 경우에만.