문제

배열과 해시는 Perl에 스칼라 만 포함 할 수 있으므로 왜 $를 사용하여 통역사에게 배열 또는 해시 요소에 액세스 할 때 값이 스칼라임을 알려야합니까? 다시 말해, 배열이 있다고 가정합니다 @myarray 그리고 해시 %myhash, 왜해야합니까?

$x = $myarray[1];
$y = $myhash{'foo'};

그냥하는 대신 :

$x = myarray[1];
$y = myhash{'foo'};

위의 이유는 왜 모호합니까?

그 장소에서 $이 아닌 경우 불법적 인 Perl 코드가 아닌가? 예를 들어, Perl에서 다음과 같은 불법이 아닌가?

@var[0];
@var{'key'};
%var[0];
%var{'key'};
도움이 되었습니까?

해결책

슬라이스는 불법이 아닙니다.

@slice = @myarray[1, 2, 5];
@slice = @myhash{qw/foo bar baz/};

그리고 해시/배열에서 단일 값을 얻으려면 지정 해야하는 이유의 일부라고 생각합니다.

다른 팁

방금 사용했습니다

my $x = myarray[1];

프로그램과 놀랍게도 다음은 내가 그것을 실행했을 때 일어난 일이 있습니다.

$ perl foo.pl 
Flying Butt Monkeys!

전체 프로그램이 다음과 같이 보이기 때문입니다.

$ cat foo.pl 
#!/usr/bin/env perl

use strict;
use warnings;

sub myarray {
  print "Flying Butt Monkeys!\n";
}

my $x = myarray[1];

따라서 MyArray는 단일 요소가 포함 된 익명 배열에 대한 참조를 전달하는 서브 루틴을 호출합니다.

그것이 배열 액세스에시길이 필요한 또 다른 이유입니다.

시길은 컨테이너의 반환 유형을 제공합니다. 그래서 무언가가 시작되면 @, 당신은 그것이 목록을 반환한다는 것을 알고 있습니다. 시작하는 경우 $, 스칼라를 반환합니다.

이제 Sigil 다음에 식별자 만있는 경우 ( $foo 또는 @foo, 그런 다음 간단한 가변 액세스입니다. 뒤에 a [, 그것은 배열에서 액세스하는 것입니다. {, 그것은 해시에 대한 액세스입니다.

# variables
$foo
@foo

# accesses
$stuff{blubb} # accesses %stuff, returns a scalar
@stuff{@list} # accesses %stuff, returns an array
$stuff[blubb] # accesses @stuff, returns a scalar
              # (and calls the blubb() function)
@stuff[blubb] # accesses @stuff, returns an array

일부 인간 언어는 매우 비슷한 개념을 가지고 있습니다.

그러나 많은 프로그래머는 혼란스러워서 Perl 6은 변하지 않는시길을 사용한다는 것을 발견했습니다.

일반적으로 Perl 5 컴파일러는 무언가가 목록에 있거나 스칼라 컨텍스트에 있으면 컴파일 시간에 알고 싶어하므로 선도적 인 Sigil이 없으면 일부 용어가 모호해질 것입니다.

이것은 유효한 perl입니다 : @var[0]. 길이 1의 배열 조각입니다. @var[0,1] 길이 2의 배열 조각입니다.

@var['key'] 배열은 숫자로 만 인덱싱 될 수 있고 다른 두 개는 유효한 Perl이 아닙니다.%var[0] and %var['key']해시 슬라이스가 {}를 사용하여 해시를 색인하기 때문에 유효한 Perl이 아닙니다.

@var{'key'} 그리고 @var{0} 그러나 둘 다 유효한 해시 슬라이스입니다. 분명히 길이 1 조각을 가져가는 것은 정상이 아니지만 확실히 유효합니다.

보다 Perldata Perldoc의 슬라이스 섹션Perl에서 슬라이스에 대한 자세한 내용은

사람들은 이미 슬라이스와 상황을 가질 수 있다고 지적했지만 Sigils는 다른 모든 것과 변수를 분리하기 위해 있습니다. 현명한 변수 이름을 선택하기 위해 모든 키워드 나 서브 루틴 이름을 알 필요는 없습니다. 다른 언어로 Perl에 대해 내가 놓친 큰 것 중 하나입니다.

나는 한 가지 방법을 생각할 수 있습니다

$x = myarray[1];

모호합니다 - m이라는 배열을 원한다면 어떻게해야합니까?

$x = m[1];

Regex 경기와는 별도로 어떻게 말할 수 있습니까?

다시 말해, 구문은 Perl 통역사를 돕기 위해 있습니다.

Perl 5에서 (Perl 6에서 변경되도록) SIGIL은 다음을 나타냅니다. 문맥 당신의 표현의.

  • 당신은 해시에서 특정 스칼라를 원합니다. $hash{key}.
  • 배열에서 특정 슬롯의 값을 원하므로 $array[0].

그러나 Zigdon이 지적했듯이 슬라이스 합법적입니다. 그들은 그 표현을 a에서 해석합니다 목록 문맥.

  • 해시에서 1 값 목록을 원합니다. @hash{key} 공장
  • 그러나 더 큰 목록도 마찬가지로 작동합니다 @hash{qw<key1 key2 ... key_n>}.

  • 배열에서 몇 개의 슬롯을 원합니다. @array[0,3,5..7,$n..$n+5] 공장

  • @array[0] 크기 1의 목록입니다.

"해시 컨텍스트"는 없으므로 %hash{@keys} ...도 아니다 %hash{key} 의미가 있습니다.

그래서 당신은 가지고 있습니다 "@" + "array[0]" <=> <sigil = context> + <색인 표현식> 완전한 표현식으로.

Sigil은 액세스의 컨텍스트를 제공합니다.

  • $ 스칼라 컨텍스트 (스칼라 변수 또는 해시 또는 배열의 단일 요소)를 의미합니다.
  • @ 수단 목록 컨텍스트 (해시 또는 배열의 전체 배열 또는 조각)
  • % 전체 해시입니다

Perl 5에는 Bareword 식별자의 기본 해석이 서브 루틴 호출의 기본 해석이기 때문에 Sigils ($ 및 @)가 필요합니다 (따라서 대부분의 경우 사용이 필요하지 않음).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top