2011-08-16 3 views
12

Perl에서 한 줄의 foreach 루프를 사용할 수 있습니까?Perl foreach 루프를 한 줄로 작성할 수 있습니까?

$hash{$thing}++ foreach my $thing (@things); 

나는

die "Invalid file!\n" if (open($Handle, "file.txt")); 

나는 열려있는 문이 어쩌면 깨진 것을 알고,이 같은 많은 다른 명령 가능합니다 알고 : 거의

+0

@Zaid : "인라인 루프"? 어쩌면 그것은 나 일 뿐이었지만 이전 제목은 더 알기 쉽습니다./ – musiKk

+0

@musiKk : Revised. – Zaid

+0

두 번째 문장에서 :'if'를'unless'로 변경하거나보다 일반적인 숙어 (및 3arg 열기 및 어휘 핸들)'open $ handle, < ','file.txt '또는 die "파일 열기 오류 : $! ";'물론 파일을 읽기보다는 열기 위해서''> ''를 사용하십시오. –

답변

29

. foreach는 접미사에서는 _ $를 사용해야합니다

$hash{$_}++ foreach @things; 

또는 동등 (forforeach 때문에 구문 별칭된다) :

$hash{$_}++ for @things; 
+1

+1은 간결하고 'for'는. –

+0

방금 ​​게시 한 후에 알게되었지만 신속한 회신에 감사드립니다. 한 문장에서 명명 된 변수가 과도한 공격이라고 깨달았습니다. –

+0

이 구문을 문서화 한 곳을 알려주십시오. perlsyn 페이지는 이것을 언급하지 않습니다. – user907860

3

당신은 할 수 있습니다 :

foreach my $thing (@things) {$hash{$thing}++}; 

경우 어휘 적으로 범위가 지정된 변수를 사용하여 한 줄에 표시 할 수 있습니다. foreach을 반전하고 루프 범위 변수를 유지할 수 없습니다.

+5

"foreach를 반전 할 수없고 루프 범위 변수를 유지할 수 없습니다." 그 이름으로 말하면 안돼,하지만 뭐? 한 줄짜리'foreach'는 명명 된 화제를 필요로하지 않습니다. '$ hash {$ _} ++ for @ things'은 해쉬 ** it **를 각 일에 대해, 또는 더 많은 영어로, 해시로 ** ** 일들을 말합니다. '$ _'는 "it"으로 읽어야한다는 것을 기억하십시오. 그리고 "it"은 루프 스코프 된 변수가 될 것이 보장됩니다. 게다가 그것은 루프에 어휘 적으로 범위가 지정된 아주 새로운 private 변수가 될 것입니다 ** IFF ** 그 이름으로 남아있는 어휘 (read :'$ _')가 이미 범위에 있고 다른 경우에는 동적으로 범위가 있다면. 어느 쪽이든 여전히 루프 스코프입니다. – tchrist

관련 문제