수색…


목록으로 배열

배열은 Perl의 기본 변수 유형 중 하나입니다. 여기에는 0 개 이상의 스칼라로 구성된 순서가 지정된 목록이 포함됩니다. 배열은 perldata에 설명되어있는 것처럼 목록 데이터를 보유하고있는 (그리고 액세스 권한을 제공하는) 변수입니다.

배열에리스트를 할당 할 수 있습니다 :

my @foo = ( 4, 5, 6 );

목록이 예상되는 모든 위치에서 배열을 사용할 수 있습니다.

join '-', ( 4, 5, 6 );
join '-', @foo;

일부 연산자는 배열에 포함 된 목록을 변경하기 때문에 배열에서만 작동합니다.

shift @array;
unshift @array, ( 1, 2, 3 );
pop @array;
push @array, ( 7, 8, 9 );

해시에리스트 할당하기

목록을 해시 변수에 할당 할 수도 있습니다. 해시 변수에 할당 할 목록을 만들 때 키와 값 사이에 쉼표 => 를 사용하여 관계를 표시하는 것이 좋습니다.

my %hash = ( foo => 42, bar => 43, baz => 44 );

=> 는 실제로 피연산자를 왼쪽으로 자동 인용하는 특별한 쉼표입니다. 따라서 일반적인 쉼표를 사용할 는 있지만 관계가 명확하지 않습니다.

my %hash = ( 'foo', 42, 'bar', 43, 'baz', 44 );

fat comma => 의 왼쪽 피연산자에 따옴표로 묶은 문자열을 사용할 수도 있는데, 공백을 포함하는 키에 특히 유용합니다.

my %hash = ( 'foo bar' => 42, 'baz qux' => 43 );

자세한 내용은 perldoc perlop 쉼표 연산자 를 참조하십시오.

목록을 서브 루틴으로 전달할 수 있습니다.

목록을 서브 루틴으로 전달할 때 서브 루틴의 이름을 지정한 다음 목록을 제공합니다.

test_subroutine( 'item1', 'item2' );
test_subroutine  'item1', 'item2';     # same

내부적으로 Perl은 이러한 인수에 별명 을 지정하고 서브 루틴 내에서 사용할 수있는 배열 @_ 넣습니다.

@_ =  ( 'item1', 'item2' ); # Done internally by perl

다음과 같이 서브 루틴 인수에 액세스합니다.

sub test_subroutine {
    print $_[0]; # item1
    print $_[1]; # item2
}

별칭을 사용하면 서브 루틴에 전달 된 인수의 원래 값을 변경할 수 있습니다.

sub test_subroutine {
    $_[0] +=  2;
}

my $x =  7;
test_subroutine( $x );
print $x; # 9

서브 루틴으로 전달 된 원래 값의 부주의 한 변경을 막으려면 서브 루틴을 복사해야합니다.

sub test_subroutine {
    my( $copy_arg1, $copy_arg2 ) =  @_;
    $copy_arg1 += 2;
}

my $x =  7;
test_subroutine $x; # in this case $copy_arg2 will have `undef` value
print $x; # 7

얼마나 많은 인수가 서브 루틴으로 전달되었는지 테스트하려면 @_ 의 크기를 확인하십시오.

sub test_subroutine {
    print scalar @_, ' argument(s) passed into subroutine';
}

배열 인수를 서브 루틴으로 전달하면 모든 인수가 병합됩니다 .

my @x =  ( 1, 2, 3 );
my @y =  qw/ a b c /; # ( 'a', 'b', 'c' )
test_some_subroutine @x, 'hi', @y; # 7 argument(s) passed into subroutine
# @_ =  ( 1, 2, 3, 'hi', 'a', 'b', 'c' ) # Done internally for this call

test_some_subroutine$_[4] = 'd' 문이 있으면 위의 호출에서 $y[0] 이 값 d 를 갖게됩니다.

print "@y"; # d b c

서브 루틴에서 목록 반환

물론 하위 목록에서 목록을 반환 할 수 있습니다.

sub foo {
    my @list1 =  ( 1, 2, 3 );
    my @list2 =  ( 4, 5 );

    return    ( @list1, @list2 );
}

my @list =  foo();
print @list;          # 12345

그러나 당신이하고있는 것을 알지 못한다면 그렇게하는 것이 권장되는 방법은 아닙니다 .

결과가 LIST 컨텍스트에있는 경우에는 정상이지만 SCALAR 컨텍스트에서는 문제가 명확하지 않습니다. 다음 줄을 살펴 보겠습니다.

print scalar foo();  # 2

2 ? 무슨 일 이니?

  1. foo()SCALAR 컨텍스트에서 평가 되므로이 목록 ( @list1, @list2 )SCALAR 컨텍스트에서 평가됩니다.
  2. SCALAR 컨텍스트에서 LIST는 마지막 요소를 반환합니다. 여기는 @list2
  3. 다시 SCALAR 컨텍스트에서 array @list2 는 해당 요소의 수를 반환합니다. 여기에 2 입니다.

대부분의 경우 올바른 전략은 데이터 구조에 대한 참조를 반환 합니다.
그래서 우리의 경우에는 대신 다음을 수행해야합니다.

 return    ( \@list1, \@list2 );

그런 다음 호출자는 반환 된 두 개의 arrayrefs 를 받기 위해 이와 같은 작업을 수행합니다.

 my ($list1, $list2) = foo(...);

arrayref를 사용하여 배열을 sub로 전달

@foo 대한 arrayref는 \@foo 입니다. 배열과 다른 것들을 서브 루틴에 전달해야 할 때 편리합니다. @foo 를 전달하는 것은 여러 스칼라를 전달하는 것과 같습니다. 하지만 \@foo 전달하는 것은 단일 스칼라입니다. 서브 루틴 내부 :

xyz(\@foo, 123);
...
sub xyz {
    my ($arr, $etc) = @_;
    print $arr->[0]; # using the first item in $arr. It is like $foo[0]

목록으로 해시

목록 컨텍스트에서 해시가 병합됩니다.

my @bar =  ( %hash, %hash );

배열 @bar 는 2 %hash 해시 목록으로 초기화됩니다.

  • %hash 모두 병합됩니다.
  • 병합 된 항목에서 새 목록이 생성됩니다.
  • @bar 배열은 그리스트에 의해 초기화됩니다.

키 - 값 쌍이 함께 보장됩니다. 키는 항상 색인화되며 값은 홀수입니다. 키 - 값 쌍이 항상 같은 순서로 병합된다는 보장은 없습니다.

my %hash =  ( a => 1, b => 2 );
print %hash; # Maybe 'a1b2' or 'b2a1'


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow