Program Tip

Perl에서 shift ()는 무엇을합니까?

programtip 2020. 11. 15. 11:41
반응형

Perl에서 shift ()는 무엇을합니까?


다음 줄은 무엇을 의미 할 수 있습니까?

my $x = shift;

shift()배열을 인수로 취한 다음 해당 배열의 첫 번째 항목을 반환하고 삭제하는 내장 Perl 서브 루틴입니다. shift호출 과 함께 서브 루틴에 전달 된 모든 매개 변수를 얻는 것이 일반적 입니다. 예를 들어, foo세 개의 인수를 사용 하는 서브 루틴 있다고 가정하십시오 . 이러한 매개 변수를 지역 변수에 할당하는 한 가지 방법은 다음과 shift같습니다.

sub foo() {
  my $x = shift;
  my $y = shift;
  my $z = shift;
  # do something
}

여기서 혼란은 shift가 배열을 인수로 전달하지 않는 것처럼 보인다는 것입니다. 실제로 @_서브 루틴 내부 또는 서브 루틴 @ARGV외부에있는 "기본"배열을 암시 적으로 전달하고 있습니다.


shift함수는 배열에서 첫 번째 요소를 제거하고이를 반환합니다. 배열은 하나의 요소로 단축됩니다.

기본 배열 (매개 변수로 지정되지 않은 @_경우 )은 함수에 있거나 @ARGV파일 범위에있는 경우입니다.

따라서이 경우 $x에는 첫 번째 함수 매개 변수 또는 첫 번째 명령 줄 매개 변수로 설정됩니다.


Perl에서는 인수를 명시 적으로 지정하지 않으면 많은 메서드가 기본 변수 ( $_@_)를 사용합니다 . 코드는 다음과 동일합니다.

my $x = shift @_;

앞서 PullMonkey에서 지적했듯이 서브 루틴 내에서 해당 서브 루틴에 @_전달 된 인수를 포함합니다 (에서 설명 perlsub). shift에서 첫 번째 인수 값을 제거 @_하고에 저장 $x하므로 $_[0]이제 서브 루틴에 전달 된 두 번째 인수를 제공합니다.


이것은 일반적으로 관용구입니다. $ x는 서브 루틴에 전달 된 첫 번째 매개 변수에 할당 된 지역 변수입니다.

my ($x) = @_;

아마도 더 명확 할 것입니다 (인수 목록을 수정하지 않음).


평신도의 언어에서 매우 높은 수준의 관점에서 시프트 는 배열의 첫 번째 요소 (가장 왼쪽 부분)를 취하는 반면 반대는 배열의 마지막 요소 (가장 오른쪽 부분)를 취하는 입니다.

내 @ array1 = (5,6,7,8,9);
내 $ x = 시프트 @ array1;
print "$ x \ n"; # 5
print "@ array1 \ n"; # 678 9

서브 루틴에있는 경우이 행이 shift켜집니다 @_(전달되는 매개 변수).
그래서 $x첫 번째 항목이 될 것이다 popped로부터 @_배열입니다.

그래서 보통 당신은 볼 것입니다 $x = shift if @_;

참고 URL : https://stackoverflow.com/questions/296964/what-does-shift-do-in-perl

반응형