Perl의 스칼라와 목록 컨텍스트의 차이점은 무엇입니까?
문제
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는 특정 상황에서 객체를 문자열로 변환합니다. 그리고 내가 사용한 모든 비 스크립팅 언어에는 비슷한 개념이 있습니다.