Tuesday, December 25, 2012

Perl에서 File Read 하기

File 열기
open(F, $filename);
과 같이 실행하면 파일을 연다. F 가 파일 핸들러가 된다.

The Diamond Operator
이제 파일 핸들러를 이용해 파일의 내용을 불러와야 되는데 이때 쓰이는 것이 diamond operator이다. File Hander 를 F 라고 할때 라고 쓰면 파일 내용을 한 라인씩 불러온다. 여기서 '라인'이란 'input record separator' 에 저장된 스트링으로 나뉜 단위를 말한다. input record separator 는 $/ 라는 predefined 변수에 저장된 값이며 디폴트 값은 newline character이다.

예)
@lines = <F>; # 파일 전체 내용을 array 에 불러온다.
$line = <F>; # 파일을 한줄씩 불러온다.
이처럼 Array 로 받으면 파일 전체를 읽어오고 scalar 값으로 받으면 한줄씩 불러오는 차이가 있다.

File 닫기
읽고 나면 파일을 닫는다.
close(F);

특수한 파일 핸들러 STDIN (standard input)
사용자 입력은 개념적으로 File handler 와 동일하다.
print "What is your name?";
$name = <STDIN>;

Diamond Operator 에 파일 핸들이 안주어지는 경우
생략되면 우선 @ARGV 를 찾고, arguments 가 안주어졌으면 STDIN 에서 받는다.
 while (<>) {  
   print();  
 }  

Binary File 읽는 법 (여기 나온 코드 이용한 것)
 use strict;  
 use warnings;   
 my $file = "/Users/hur/new/Work cur/scripts/MyPerlScripts/test12bytes.bin";  
 my $errmsg = "\nUnable to open $file\n";  
   
 die $errmsg unless(open FILE, $file);  
 binmode(FILE);  
   
 # Get rid of the line separator. This allows us to read everything in one go.  
 undef $/;  
   
 # Read the entire file. If you don't want to read all of it at once, you need the read() subroutine.
 my $contents = <FILE>;  
   
 print "Read " . length($contents) . " bytes\n";  
 close FILE;  

Text File 읽기 (전체 파일 내용을 하나의 string 으로 가져옴)
 sub LoadTextFile  
 {  
      my $filepath = shift;  
      open(F, $filepath);   
      my @lines_ = <F>;   
      close(F);   
      my $result;  
      my @lines;  
      foreach my $line (@lines_){   
           $result .= $line;  
      }  
      return $result;  
 }  

Text File 읽기 (라인별로 array로 가져오기. LF, CR, CRLF 세가지 모두 다룰 수 있게 한 것)
 use strict;  
 use warnings;  
 main();  
 sub main  
 {  
      if(scalar(@ARGV) == 0){ exit(0); }  
      my $filepath = $ARGV[0];  

      open(F, $filepath);  
      my @lines_ = <F>;  
      close(F);  

      my @lines;  
      foreach my $line (@lines_){  
           $line = trimNewlines($line);  
           my @a = split(/\r/, $line);   
           foreach(@a){  
                push(@lines, $_);  
           }  
      }  
      printDS(\@lines);  
 }  
 sub trimNewlines  
 {  
      my $string = shift;  
      $string =~ s/[\r|\n]+$//;  
      return $string;  
 }  
 sub printDS  
 {  
      my $ds = shift;  
      use Data::Dumper;   
      print Dumper @$ds;  
      print "\n";  
 }  

Perl의 File 관련 함수들
File Functions
File Test Operators

레퍼런스 :
File handling (http://www.comp.leeds.ac.uk/Perl/filehandling.html)
The Diamond Operator
Perl 5 by example by David Medinets 09 - Using Files
Perl File Open: Creating, Reading and Writing to Files in Perl
perlpacktut - tutorial on pack and unpack

키워드 : Read / Write

No comments:

Post a Comment