Perl Language
기울기
수색…
목록으로 배열
배열은 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
? 무슨 일 이니?
-
foo()
는 SCALAR 컨텍스트에서 평가 되므로이 목록( @list1, @list2 )
도 SCALAR 컨텍스트에서 평가됩니다. - SCALAR 컨텍스트에서 LIST는 마지막 요소를 반환합니다. 여기는
@list2
- 다시 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'