2014-02-06 1 views
0

grep의 출력을 변수에 할당하려고하는데 출력으로 숫자가 표시됩니다.변수에서 grep 및 분할 처리로 perl 오류가 발생했습니다.

사례 I :

출력

print (grep !/create/i&&!/or/i &&!/replace/i&&!/package/i&&!/body/i&&!/as/i , split (//, $str1[0])); 

케이스 II의 :

my $pname = grep !/create/i&&!/or/i &&!/replace/i&&!/package/i&&!/body/i&&!/as/i , split (//, $str1[0]) ; 
print $pname , "\n"; 

의 문자열 만 출력 차이는 무엇 수

입니다 d 어떻게 문자열을 얻을 수 있습니다.

도움을 주시면 감사하겠습니다.

감사합니다,

Vamshi .D 많은 펄 기능 (및 운영자)처럼

답변

2

, grep리스트 컨텍스트와 스칼라 문맥에서 약간 다른 일을한다. 다른 반환 동작은 its documentation에 설명되어 있습니다.

은 (로컬 각 요소 $ _ 설정)리스트의 각 요소에 대한 블록 또는 EXPR를 평가 및 표현식이 참으로 평가하는 것과 원소로 이루어진리스트 값을 반환한다. 스칼라 컨텍스트에서 표현식이 참인 횟수를 반환합니다.

첫 번째 예에서 print은 표현식에 목록 컨텍스트를 적용하므로 값 목록을 반환합니다. 두 번째 예에서는 결과를 스칼라에 할당하므로 grep이 스칼라 컨텍스트에서 호출되고 발견 된 일치 항목의 수를 반환합니다.

해결 방법은 grep이 목록 컨텍스트에서 호출되도록하는 것입니다. 이 작업을 수행하는 두 가지 쉬운 방법은 목록 할당을 수행하는 것입니다.

my ($pname) = grep ...; 

또는 결과를 배열에 할당하면됩니다.

my @pnames = grep ...; 

the documentation에 익숙해지면 Perl 프로그래밍이 훨씬 쉬워집니다.

2

grep을 사용하는 경우 목록을 처리합니다. grep은 입력을리스트로 취하고리스트를 출력으로 생성합니다.

배열이 스칼라 컨텍스트에서 평가 될 때마다 (예 : 스칼라 변수에 할당) 길이를 반환합니다. 목록 컨텍스트에서 평가 될 때마다 배열 자체를 반환합니다. 이 경우 grep은 배열과 같은 방식으로 작동하여 스칼라 컨텍스트에서 평가할 때 grep에서 반환 된 목록의 길이를 반환합니다. $pname는 스칼라 변수이기 때문에

my $pname = grep { 
       !/create/i&&!/or/i &&!/replace/i&&!/package/i&&!/body/i&&!/as/i 
      } split//, $str1[0]); 
print $pname , "\n"; 

는 그렙에서 반환 된 목록의 크기를 반환합니다.할당이 (약 $pname 괄호 통지)리스트 문맥에서 수행되기 때문에

my ($pname) = grep { 
       !/create/i&&!/or/i &&!/replace/i&&!/package/i&&!/body/i&&!/as/i 
      } split//, $str1[0]); 
print $pname , "\n"; 

는리스트의 제 요소를 리턴한다. 여기

컨텍스트에 대한 간략한 개요입니다 http://perlmaven.com/scalar-and-list-context-in-perl

+2

"목록은 스칼라 문맥에서 평가 될 때마다 (예 : 스칼라 변수에 할당로), 그것의 길이를 반환합니다"- 당신이 생각하는 이유를 나는 볼 수 있습니다 사실 (이 경우 grep이 어떻게 작동하는지는 확실합니다.)하지만 이것은 일반적인 경우에는 사실이 아닙니다. 목록은 스칼라 컨텍스트에서 길이를 반환하지 않습니다 ** - 배열입니다. 배열과리스트는 같은 것이 아닙니다 **. 이 개념을 명확히하기 위해 [이 블로그 게시물] (http://perlhacks.com/2013/12/misunderstanding-context/)을 썼습니다. –

+0

@DaveCross 감사합니다. 나는 바로 잡을 것입니다. 나는 실제로 당신의 기사를 몇 주 전에 읽었고 나는 * 여전히 * 잘못 알고있다. doh! –

관련 문제