문제

Perl의 스칼라와 목록 컨텍스트의 차이점은 무엇이며 Java 또는 JavaScript와 같은 다른 언어와 유사하게 나타나나요?

도움이 되었습니까?

해결책

Perl의 다양한 연산자는 컨텍스트에 민감하며 목록 및 스칼라 컨텍스트에서 다른 결과를 생성합니다.

예를 들어:

my(@array) = (1, 2, 4, 8, 16);
my($first) = @array;
my(@copy1) = @array;
my @copy2  = @array;
my $count  = @array;

print "array: @array\n";
print "first: $first\n";
print "copy1: @copy1\n";
print "copy2: @copy2\n";
print "count: $count\n";

산출:

array: 1 2 4 8 16
first: 1
copy1: 1 2 4 8 16
copy2: 1 2 4 8 16
count: 5

지금:

  • $first 괄호가 my($first) 배열 컨텍스트를 제공하지만 하나의 값에 대한 공간 만 있습니다. $first.
  • 둘 다 @copy1 그리고 @copy2 사본을 포함합니다 @array,
  • 그리고 $count 스칼라 컨텍스트이기 때문에 5가 포함되어 있으며 @array 스칼라 컨텍스트에서 배열의 요소 수를 평가합니다.

보다 정교한 예제도 구성 될 수 있습니다 (결과는 독자를위한 연습입니다).

my($item1, $item2, @rest) = @array;
my(@copy3, @copy4) = @array, @array;

내가 아는 다른 언어로 목록과 스칼라 컨텍스트와 직접적인 평행은 없습니다.

다른 팁

스칼라 컨텍스트는 단일 값을 찾을 때 얻는 것입니다. 목록 컨텍스트는 여러 값을 찾을 때 얻는 것입니다. 구별을 볼 수있는 가장 일반적인 장소 중 하나는 배열로 작업 할 때입니다.

@x = @array;  # copy an array
$x = @array;  # get the number of elements in an array

다른 연산자와 함수는 컨텍스트에 민감합니다.

$x   = 'abc' =~ /(\w+)/;  # $x = 1
($x) = 'abc' =~ /(\w+)/;  # $x = 'abc'
@x   = localtime();       # (seconds, minutes, hours...)
$x   = localtime();       # 'Thu Dec 18 10:02:17 2008'

주어진 컨텍스트에서 연산자 (또는 함수)가 동작하는 방법은 연산자에게 달려 있습니다. 사물이 어떻게 행동 해야하는지에 대한 일반적인 규칙은 없습니다.

사용하여 자신의 서브 루틴 컨텍스트를 민감하게 만들 수 있습니다. wantarray 호출 컨텍스트를 결정하는 기능. 당신은 표현을 사용하여 스칼라 컨텍스트에서 평가하도록 강요 할 수 있습니다 scalar 예어.

스칼라 및 목록 컨텍스트 외에도 문서에 언급 된 "void"(반환 값 없음) 및 "부울"(진실/거짓 값 예상) 컨텍스트도 표시됩니다.

이것은 단순히 데이터 유형이 작동 모드에 따라 평가 될 것임을 의미합니다. 예를 들어, 스칼라에 대한 할당은 오른쪽이 스칼라로 평가된다는 것을 의미합니다.

맥락을 이해하는 가장 좋은 방법은 WantArray에 대해 배우는 것입니다. 그러니 =가 WantArray를 구현하는 서브 루틴이라고 상상해보십시오.

sub = {
  return if ( ! defined wantarray ); # void: just return (doesn't make sense for =)
  return @_ if ( wantarray ); # list: return the array
  return $#_ + 1; # scalar: return the count of the @_
}

예제 이 게시물 오른쪽을 매개 변수로 통과시켜 위의 서브 루틴을 호출하는 것처럼 작업하십시오.

다른 언어의 유사점에 관해서는, 그렇습니다. 나는 여전히 거의 모든 언어가 비슷한 것을 지원한다고 주장합니다. 다형성은 모든 OO 언어에서 유사합니다. 또 다른 예, Java는 특정 상황에서 객체를 문자열로 변환합니다. 그리고 내가 사용한 모든 비 스크립팅 언어에는 비슷한 개념이 있습니다.

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