2009-06-15 9 views
1

좋아, 여기에 약간의 문제가있다. 이 스 니펫을 작동 시키려면 * .HTML 핸들을 설정할 필요가 없다는 것을 알지만,이 코드는 컨텍스트 외부에서 가져와 실제로 $ 핸들을 사용해야합니다. 내가받는 출력은 스 니펫 아래에 있지만 원하는 출력은 file.html에 "what \ nsometext1 \ nsometext2 \ n"을 포함하는 것입니다.펄 글로브 및 파일 핸들 문제

open(HTML, ">file.html"); 
$handle = \*::HTML; 
print $handle "what\n"; 

open(READ, "< somefile.txt"); #somefile.txt contains sometext1\nsometext2\n 
while(<READ>) 
{ 
    print $handle; 
} 
close READ; 
close HTML; 

file.html과 상기 출력 남아 "무엇"및 GLOB (0x6278b0) GLOB (0x6278b0)는 단말기 화면으로 출력된다.

답변

11

당신은 print를 호출하는 세 가지 유효한 방법이 있다고 볼 수 있습니다 :

  • 인쇄 FILEHANDLE의 명부
  • 인쇄 목록
  • 인쇄

만 마지막 버전 $_ 암시 적으로 인쇄합니다. 그 이유는 간단하기 때문에 펄은 더 많은 정보 (파일 핸들과리스트를 분리하는 공백)없이 파일 핸들을 인쇄 할 것인지 또는 파일 핸들을 인쇄 할 것인지를 알 수 없습니다. 파일 핸들을 인쇄하는 것이 가장 유연한 방법이므로, 모호한 경우의 해결책을 선택했습니다.

+2

실제로 "print handle"도 $ _을 사용하지만 펄은 모호한 스칼라를 "print LIST"로 구문 분석합니다. (그리고 "print {$ fh}"은 구문 오류입니다.) –

1

나는 그것을 알아 냈다. 이 경우 $handle 뒤에 $_이 필요합니다. 당신이 documentation for print 보면

+0

인쇄가 문맥 상입니다. 단일 인수를 사용하면 STDOUT으로 인쇄한다고 가정합니다. 두 개 이상의 인수를 사용하여 첫 번째 인수를 인쇄하려는 glob로 가져옵니다. 그리고 이미 $ handle이라는 인자를 지정했기 때문에 $ _을 기본 인자로 사용하지 않을 것입니다. –

4

파일 핸들을 저장하기 위해 스칼라 변수를 사용할 때 Perl은 표현식을 구문 분석하는 방법을 이해할 수 있도록 도와야합니다. print $var은 모호합니다. 다음 중 하나를 의미 할 수 있습니다.

print STDOUT $var; # print the contents of $var to STDOUT 
print {$var} $_; # print the contents of $_ to the handle $var 

Perl이 Perl을 선택합니다. 후자를 원하면 파일 핸들을 모호하게하려면 파일 핸들을 대괄호로 묶어서 명시 적으로 지정해야합니다.

또한 무엇을 인쇄할지에 대한 인수를 제공하지 않을 때 Perl은 기본 변수 $_ 만 사용합니다. print $var의 해석 방법으로 인해 $_은 사용되지 않습니다.

3

Perl의 print operator은 모든 경우에 LIST를 생략 할 수 있습니다.

$ perl -le '$_ = "foo!"; print STDOUT' 
foo! 

을하지만 런타임에 무엇이든 될 수있는 파일 핸들-달리 print $scalar 같은 파서에 보이는 : 고려한다. print, print $handleprint STDOUT : 당신이 코드의 비트에 대한 해석의 확실하지 않은 경우, 서면으로

$ perl -MO=Deparse,-p try 
while (defined(($_ = <READ>))) { 
    print($_); 
    print($handle); 
    print(STDOUT $_); 
} 

같이 B::Deparse를 통해 공급, 루프 인쇄에 세 개의 호출이 포함되어 있습니다. 반환에게 이전에 선택된 파일 핸들을 선택

my $oldfh = select $handle; 

while(<READ>) 
{ 
    print; 
} 

select $oldfh; 

주, 그리고 우리가 그들을 발견 한 곳 물건을 다시 넣어하기 위해 위의 코드를 저장합니다

가까운 당신이 원하는 무엇을 얻으려면, 당신은 select 사용할 수 있습니다 기후.

1
use strict; 
use warnings; 

open(my $html, '>', "file.html"); 
print $html "what\n"; 

open(my $read, '<', "somefile.txt"); #somefile.txt contains sometext1\nsometext2\n 

while(my $line = <$read>) { 
    print {$handle} $line; 
} 

close $read; 
close $html;