2009-07-10 4 views
4

Perl을 처음 사용합니다. 그래도 조금 C를 알아.Perl에서 인쇄 된 후 얼마 동안입니까?

$STUFF="c:/scripts/stuff.txt"; 

open STUFF or die "Cannot open $STUFF for read :$!"; 

print "Line $. is : $_" while (<STUFF>); 

가 왜 print 문 후 while이다 : 나는 우리 교실 노트 중 하나에이 조각을 가로 질러왔다? 그것은 무엇을합니까?

+0

몇 권인가? –

+2

** '경고'**이 코드는 사용하지 마십시오. 잘못 작성되었습니다. –

+1

아, 예, 파일 핸들로 무엇을하고 있는지 알지 못했습니다. 그건 사악 해. – chaos

답변

10

그것은 그것보다 간단하고 컴팩트 때문입니다 방법을 쓴 것

while (<STUFF>) { 
    print "Line $. is : $_"; 
} 

동일합니다. 일반적으로 Perl의 (in)은 조건부 및 루프에 대해 유명한 "구문 수정 자"형식입니다. 이것이 수행하는 루프를 반복 할 때마다이

print "Line $. is : $_" while (<STUFF>); 

while (<STUFF>) { 
    print "Line $. is : $_"; 
} 

이다, 펄 하나의 읽기 : 다음 조각은 같은 일을 작성 정확히 상응하는, 단지 다른 방법이됩니다

while (<STUFF>) { print "Line $. is : $_"; } 
+1

나는 그것이 더 간단하다는 것에 동의하지 않을 것이다 (만약 그렇다면,이 질문은 존재하지 않을 것이다!) – dbr

+2

그것은 더 간단하다. 모든 배경에 대해 모든 사람에게 직관적으로 명확하지 않습니다. 두 가지가 서로 더 간단하고 복잡한 지 여부를 판단 할 때 시청자가 "오,이게 더 복잡하다는 것을 알기보다는 오히려 두 가지가 무엇을 의미 하는지를 알고 있다는 가정하에 작업해야한다고 생각합니다. 왜냐하면 C Perl이 아닙니다. " – chaos

+0

더 간단하고 간단하지는 않습니다. 나는 그걸 간단하게 생각하지만 펄을 잠시 동안 알고있다. –

0

동일 텍스트 줄을 STUFF 파일에서 가져 와서 특수 변수 $_에 넣습니다 (꺽쇠 괄호의 기능). 이어서, 루프를 인쇄 라인의 본체와 같은

Line 1 is : test 
Line 2 is : file

특별한 변수 $.은 파일로부터 판독 된 마지막 행의 행 번호이고 $_ 각도 브래킷 오퍼레이터에 의해 설정된 해당 광고의 내용이다.

4

3

인쇄 후에 잠시 뒤에 행을 일반 영어와 거의 같이 읽게하십시오. 그것은 또한 대신 인쇄물에 중점을 둡니다. 그리고 필요하지 않은 중괄호 : { ... }

도 사용할 수 있습니다 와 경우와하지 않는 한, 예를 들어, 그것은 한 줄의 경우 while 문은 루프 본문을 따를 수 있음을

print "Debug: foobar=$foobar\n" if $DEBUG; 

print "Load file...\n" unless $QUIET; 
+2

내가 stackoverflow :-)를 게시하기 전에 abt 'if'와 'unless'를 알려 주셔서 감사합니다. –

1

참고. 루프 본문이 여러 줄에서 실행되는 경우 while 앞에 붙여야합니다.

+0

이것은 C와 유사합니다. 감사합니다 :-) –

+1

PERL은 영어를 포함한 여러 다른 언어에서 구문을 빌립니다. 조건문이 한 줄짜리 블록 뒤에 오도록 허용하면 영어와 더 비슷하게 읽습니다. 'if'와'while'의 부정 버전처럼 작동하는'unless' 및'until' 키워드를보고 싶을 수도 있습니다. 이것은 내가 아는 한 C가 가지고 있지 않은 것이다. 이 코드를 사용하면 코드의 가독성이 향상되는 경우가 있습니다. – Zaid

6

다른 답변은 while 루프의 명령문 수정 자 양식을 설명했습니다. 그러나 여기에는 다른 많은 마법이 있습니다. 특히이 스크립트는 Perl의 특수 변수 중 세 가지를 사용합니다. 이 중 두 개 ($_$!)는 매우 일반적입니다. 다른 하나 ($.)는 비교적 일반적입니다. 그러나 그들은 모두 가치가 있습니다.

열려있는 파일 핸들에서 while <$fh>을 실행하면 Perl은 파일을 EOF에 도달 할 때까지 자동으로 실행합니다. 각 루프 내에서 현재 행은 아무 것도하지 않고 $_으로 설정됩니다. 그래서이 둘은 동일합니다

while (<$fh>) { # something } 
while (defined($_ = <$fh>)) { # something } 

perldoc perlop, I/O 사업자에 대한 섹션을 참조하십시오. (어떤 사람들은 마술 적이기 때문에 while (my $line = <$fh>)을 대신 사용합니다.이것은 더 명확한 변수 이름 인 $_ 대신 각 행에 대해 $line을 제공하지만보다 많은 입력이 필요합니다. 각자 자신에게).

$!은 시스템 오류 (설정되어있는 경우)의 값을 유지합니다. 이것을 사용하는 방법과시기에 대한 자세한 내용은 perldoc perlvar, $OS_ERROR에 관한 섹션을 참조하십시오.

$.에는 회선 번호가 있습니다. perldoc perlvar, $NR 섹션을 참조하십시오. 이 변수는 놀라 울 정도로 까다 롭습니다. 현재 읽고있는 파일의 줄 번호가 반드시 있어야하는 것은 아닙니다. 예 : 당신이 lines으로 이것을 저장하고 perl lines file1 file2 file3로 실행하면

#!/usr/bin/env perl 
use strict; 
use warnings; 

while (<>) { 
    print "$ARGV: $.\n"; 
} 

, 다음 펄은 바로 파일 1, 파일 2 및 파일 3을 통해 라인을 계산합니다. Perl은 파일을 읽는 것을 알고 있습니다 ($ ARGV에 있으며 파일 이름은 정확합니다). 은 각 파일의 끝에 행 번호를 자동으로 다시 설정하지 않습니다. 나는 마침내 내 (두꺼운) 해골을 마침내 이해할 때까지이 행동으로 두 번 이상 물었다. 개별 파일이 방법을 추적하기 위해 번호를 재설정 할 수 있습니다 : 당신은 또한 strictwarnings 프라그 마를 확인하고 open의 새로운 세 가지 인수 형태를 살펴한다

#!/usr/bin/env perl 
use strict; 
use warnings; 

while (<>) { 
    print "$ARGV: $.\n"; 
} 
continue { 
    close ARGV if eof; 
} 

. 방금 "unknown (google)"이라는 메시지가 나타났습니다. 다시 말하면 결코 돌아 오지 않을 것입니다. 나는 적어도 내 타이핑 연습을해야 겠지.

+2

좋은 주인! 그리고 C가 가장 복잡한 언어라고 생각했습니다. Perl은 많은 숨겨진 것들을 수행한다. 지금까지 알려지지 않은 (구글) 걱정거리는, 나는 지금 학생이다. 너무 많은 선생님 들께서 나 자신을 드러내 기 위해서 :-), 어쩌면 나중에 나는 스스로하려고 노력할 것입니다. +1 = BTW :-) –

+0

나는 그 대리인에 대해 걱정하지 않았다. (감사하지만). 그것은 모든 것을 타이핑하고 읽지 않는 것이 부끄러운 일이었을 것입니다. 다행 이구나. C와의 경험이 거의 없기 때문에 비교할 수 없습니다. 하지만 제 감각은 펄의 합병증이 대부분 당신의 삶을 편하게 해줍니다. 펄은 당신이 원하는 것을 자동으로 매우 자주 매우 자주 할 것이다. 좋은 일이야. – Telemachus

3

필자는 스 니펫을 자유롭게 다시 작성했습니다.

아래에 제안 된 코드는 야생에서 볼 수있는 최적의 방법보다 적은 도적 갤러리입니다.

use strict; 
use warnings; 

my $stuff_path = 'c:/scripts/stuff.txt'; 

open (my $stuff, '<', $stuff_path) 
    or die "Cannot open'$stuff_path' for read : $!\n"; 

# My preferred method to loop over a file line by line: 
# while loop with explicit variable 
while(my $line = <$stuff>) { 
    print "Line $. is : $line\n"; 
} 

다른 방법이 있습니다. 위의 예제에서 각 루프를 while 루프로 대체 할 수 있습니다.

# while statement modifier 
# - OK, but less clear than explicit code above. 
print "Line $. is : $_" while <$stuff>; 

# while loop 
# - OK, but if I am operating on $_ explicitly, I prefer to use an explicit variable. 
while(<$stuff>) { 
    print "Line $. is : $_"; 
} 

# for statement modifier 
# - inefficient 
# - loads whole file into memory 
print "Line $. is : $_" for <$stuff>; 

# for loop - inefficient 
# - loads whole file into memory; 
for(<$stuff>) { 
    print "Line $. is : $_\n"; 
} 

# for loop with explicit variable 
# - inefficient 
# - loads whole file into memory; 
for my $line (<$stuff>) { 
    print "Line $. is : $line\n"; 
} 

# Exotica - 

# map and print 
# - inefficient 
# - loads whole file into memory 
# - stores complete output in memory 
print map "Line $. is : $_\n", <$stuff>; 

# Using readline rather than <> 
# - Alright, but overly verbose 
while(defined (my $line = readline($stuff)) { 
    print "Line $. is : $line\n";  
} 

# Using IO::Handle methods on a lexical filehandle 
# - Alright, but overly verbose 
use IO::Handle; 
while(defined (my $line = $stuff->readline)) { 
    print "Line $. is : $line\n";  
} 
관련 문제