LogIn E-mail
설계이야기
if ( -e -z -s -f -d -T -B -M )
# 36 JMJS    16.3.10 20:46

 파일 다루기

경우에 따라 여러분은 파일과 디렉토리를 다루어야 할 때가 있으리라 생각됩니다.

PERL의 파일 다루는 솜씨는 매우 훌륭합니다. 파일의 상태 또는 이것이 파일인지 디렉토리인지 알아내기 위해서 C와 같은 언어에서는 대개 int86x, fstat 같은 시스템 의존적인 함수를 이용해야 합니다. 그러나 PERL에서는 어떤 운영체제에서도 같은 명령을 사용합니다. 단지 참조 매뉴얼이 옆에 있어야 한다는 것 뿐이죠.

파일 및 디렉토리에 대해 알고 싶은 경우 다음과 같은 함수들을 사용합니다. 기본적인 것들만 나열합니다.(perlfall.htm의 -X FILEHANDLE을 보십시오.)

문법: -X FILEHANDLE 또는 -X FILE_OR_DIR_NAME

-e  파일이 존재하는가 ? (참이면 1, 거짓이면 0을 리턴합니다.)
-z  파일 크기가 0인가 ?
-s  파일이 0 아닌 크기를 갖는가 ? (파일의 크기를 리턴합니다.)
-f  파일이 평범한 파일인가 ?
-d  파일이름이 디렉토리인가 ?
-T  파일이 텍스트 파일인가 ?
-B  파일이 이진 파일인가 ?
-M  파일이 생성된지 몇일이 되었는가 ? ( 0부터 시작 )

그럼 파일을 한 번 읽어 봅시다. 파일을 읽거나 쓰기 전에는 반드시 파일 핸들을 생성, 파일을 '열어야' 하고, 다 읽은 후에는 '닫아야' 합니다. 파일 핸들에는 변수들에 붙는 $, @, %같은 것들이 붙지 않습니다.

    # mytype1.pl
    # 도스의 type, 유닉스의 cat 명령을 흉내내어 봅시다.

    $fileName = "hello.pl";

    if( -d $fileName )  #  -d $fileName && die "$fileName ...";와 같음.
      { die "$fileName is a directory.\n"; }
      # 디렉토리를 type할 수는 없죠.
      # die 함수는 메세지를 출력하고 프로그램 실행을 중단시킵니다.

    -e $fileName || die "$fileName is not exist.\n";

    -T $fileName || die "$fileName is not a text file.\n";

    open( fileHandle, $fileName ) || die "Cannot open $fileName.\n";
    @allLines = <fileHandle>;   # 핸들을 통하여 모든 문자열을 배열로 읽어 들입니다. 파일이 너무 크면 좀 문제가 있겠죠.

    close( fileHandle ); # 다 읽었으니 꼭 닫습니다. !!!!!

     print @allLines; # 화면에 출력합니다.

아주 간단하게 만들었죠 ? 문자열을 한 줄씩 읽을 수도 있습니다. 핸들을 배열에 할당(=)시키면 모든 문자열이 다 읽히지만 일반 변수(scalar)에 할당시키면 한 줄만을 읽고, 파일의 끝에 도달했을 때에는 "undefined value"(정해지지 않은 값 ?)을 리턴 합니다. 이 undefined value는 조건식에서 사용하면 거짓으로 인식됩니다. 따라서,

    open( fileHandle, $fileName ) || die "Cannot open $fileName.\n";
    while( $aLine =  )
    {
      print $aLine;
    }
    close( fileHandle );  # 다 읽었으니 꼭 닫습니다. !!!!!

와 같이 하면 안전하게 파일의 끝까지 한 줄씩 읽으면서 print할 수 있는 것이지요. 파일의 크기가 너무 커서 메모리 사용이 과다할 것 같은 경우에는 이렇게 한 줄씩 읽어들이는것도 좋은 방법이겠지요.

open은 파일을 열고 close는 닫는 함수인데, open의 여는 동작은 다시 분류하여 생각할 필요가 있습니다.

    open( fileHandle, "<hello.pl" );  # hello.pl을 읽기 모드로 엽니다.
    open( fileHandle, "hello.pl" );   # hello.pl을 읽기 모드로 엽니다.
    open( fileHandle, ">hello.pl" );  # hello.pl을 쓰기 모드로 엽니다.
    open( fileHandle, ">>hello.pl" ); # hello.pl의 끝에서부터 추가하여
                                      # 쓰기 모드로 엽니다.
    open( fileHandle, "+<hello.pl" ); # 읽기와 쓰기 모드로 엽니다.

그럼 파일에 쓰기도 해 봅시다.
쓰기라고 겁먹을 필요가 없습니다. 모든 것을 논리적으로, 정확히 해주면 사고는 없으니까요. 그러나 확실히 이해하지 못한 경우에는 또 삼가 해야 할 것이 파일 쓰기입니다.
파일에 쓰기를 할 때도 그저 print함수를 사용하면 됩니다. 단지 파일 핸들을 명시해주는 것으로 족합니다. 사실 파일 핸들이 명시되지 않을 경우에는 consol인 STDOUT이라는 핸들에 print가 되는 것이지요.

    # write.pl
    # perltest.htm이라는 파일이 없다고 가정하고 프로그램을 합니다.
    # 있는 경우에는 덮어씁니다.

    open( fileHandle, ">perltest.html" ) || die "Failed opening.\n";
    print fileHandle <<END_HTML;  # 다를 바가 없지요 ?
    <html><head><title>test of writing</title></head>
    <body>
    <h1>Test of writing file in PERL</h1>
    Hello. I am writing something to a file.<P>
    Be careful to close the file after completion of writing.<P>
    </body>
    </html>
    END_HTML

    close( fileHandle );

위에서 print 다음의 fileHandle다음에 comma가 없음을 유의해 주세요.

게시물: 107 건, 현재: 1 / 2 쪽
[1] [2]
번호 제       목 작성자 등록일 방문
114  lunar.pl lunar.pm jinsung 21.3.9 22
113  package 변수 main 에서 사용시 local 선언 말 것 jinsung 20.12.10 53
112  foreach sort, sort uniq jinsung 21.1.31 100
111  diamond operator , jsort (square mix) jinsung 20.11.3 92
110  file2date.pl JMJS 20.1.12 155
109  UTF-8, EUC-KR JMJS 19.12.15 167
108  wget.pl LWP Simple get JMJS 19.9.17 242
100  jsame.pl JMJS 09.5.21 1726
99  jos.pl JMJS 08.11.29 1438
98  jmngr.pl - jmjspro manager JMJS 08.11.29 1473
97  vhdl.pm JMJS 08.11.29 1429
96  jreg.pl JMJS 08.11.29 1442
95  jtree.pm JMJS 08.11.29 1506
94  w2c.pl JMJS 08.11.29 1447
93  jdread.pl JMJS 08.11.29 1243
92  ffile.zip ffilediff.pl JMJS 09.4.24 1291
91  rgb2ycbcr.pl JMJS 10.5.12 1603
90  proview.pl JMJS 08.11.29 1629
89  smi_shift.pl JMJS 10.10.3 1280
88  srt2smi.pl srtshift.pl JMJS 18.7.14 1468
87  Perl CGI Input Test, getenv.cgi JMJS 18.11.21 1106
86  opendir, readdir, closedir JMJS 08.10.12 1416
85  tr a-z A-Z JMJS 08.10.3 1223
84  JARRAY->jfunc JMJS 08.10.2 1197
83  수치함수 - ... JMJS 09.5.7 1651
82  역행렬3x3 JMJS 09.5.7 1737
81  hex2int.pl JMJS 10.9.12 2444
80  stat - file status 보기 JMJS 07.12.16 1370
79  Perl Tip JMJS 09.7.20 2477
78  SMI file sync delay JMJS 07.7.18 1435
77  rmword.pl JMJS 07.6.18 1332
76  [Perl]package AP jinsung 07.2.28 1234
75  [Perl]read_dir.pl JMJS 07.2.22 1514
74  [Perl]jtab2char - tab문자를 특정 char로 바꿔주기 JMJS 07.2.22 1471
73  Perl 숫자 Sorting JMJS 11.5.17 1590
72  [CGI]GET and POST JMJS 06.11.20 3291
71  Perl Grammer JMJS 06.9.4 2847
70  표준 모듈 JMJS 06.8.10 1719
69  Getopt::Long example JMJS 06.8.10 1892
68  array of array $P[$j][$i] jinsung 20.12.20 1323
67  [HTML]테이블 배경에 그림넣기 JMJS 06.3.8 1415
66  l2w.pm - line to word JMJS 08.12.1 1379
65  make_random_chars JMJS 05.8.10 1246
64  mail 보내는 script JMJS 05.3.23 1197
63  실행파일을 실행시키고 표준에러 읽기 JMJS 09.2.25 1216
62  팝업창(공지창)띄우기 Jinsung 03.12.16 2306
61  print <<ENDLINE JMJS 03.12.5 1303
60  [HTML]Target JMJS 03.5.21 1343
59  [Perl]jutil.pm JMJS 03.5.3 1580
58  [Perl]jdiff.pl JMJS 02.6.6 1463
57  [Perl]cfilter.pm - commant filter JMJS 02.1.31 1507
56  [HTML]자동으로 다른 페이지 이동 JMJS 02.1.19 1354
55  Perl 설치하기 - ActiveWare JMJS 02.1.16 1362
54  opendir , readdir , closedir JMJS 02.1.4 1391
53  rand_diff JMJS 01.10.23 1288
52  vcd2v.pl JMJS 15.8.25 1354
51  file upload JMJS 01.3.16 1324
50  umask(070) <- chmod o-rwx 진성 01.3.16 1468
49  head2index 진성 01.3.15 1170
48  grep.pl JMJS 11.1.20 1286
47  chr(13) = \M 진성 01.3.15 1157
46  stty JMJS 01.3.12 1283
45  des.pl JMJS 01.3.8 1215
44  chr_plus.pl JMJS 01.3.8 1237
43  get passwd in unix JMJS 19.8.18 1083
42  unsort JMJS 19.9.10 1337
41  read from website web JMJS 19.5.15 1123
40  vec JMJS 01.3.8 1392
39  chomp $_ @_ say defined use 5.010 state grep any ... JMJS 18.10.27 1309
38  [Perl Tk] 도스창 없이, 펄 Tk 스크립트 실행하기; ... JMJS 17.9.30 1273
37  @bs = sort {$a <=> $b} @as; JMJS 17.7.12 1352
36  if ( -e -z -s -f -d -T -B -M ) JMJS 16.3.10 1423
35  mkmm.pl - make freemind JMJS 12.5.22 1366
34  perl -pi.orig -e "s/\bu_(\w+_t)\b/u$1/g" *.c JMJS 11.8.26 1373
33  .xls output csv 파일에 \n "가 있을때 JMJS 11.4.13 1237
32  jdcat.pl juncat.pl JMJS 11.2.24 1395
31  print chr(ord('a')); JMJS 01.3.8 1319
30  require "/user/home/jin1/jin1.pm"; JMJS 00.11.28 1256
29  for(my $i=0; $i < @abc; $i ++) {} JMJS 00.11.15 1358
28  remove blank $abc =~ s/[\s]+//g; JMJS 00.11.15 1295
27  array and for JMJS 00.11.14 1136
26  홈페이지 자동 이동 JMJS 00.10.28 1176
25  html에서 쓰이는 기호표시방법 JMJS 00.9.30 1131
24  배열의 범위 연산자 JMJS 00.9.20 1437
23  for(1..3) { print "$_";} JMJS 09.4.24 1122
22  package JMJS 00.9.18 1152
21  줄에서 한글자 고치기 JMJS 00.8.7 1251
20  hotkey function by getc JMJS 00.7.21 1348
19  read, sysread, syswrite JMJS 00.7.21 2146
18  crypt JMJS 00.7.13 1460
17  csv2gan.pl JMJS 11.4.4 1465
16  hexa JMJS 00.7.7 1275
15  file in out.pl JMJS 00.7.5 1471
14  ARGV JMJS 00.7.5 1319
13  jtime.pm - localtime, timelocal JMJS 09.4.9 1843
12  @INC JMJS 00.7.5 1679
11  $#myarray JMJS 00.7.5 1415
10  Hash of Array JMJS 00.7.5 1231
9  package JARRAY JHASH JMJS 00.7.4 1495
8  foreach, while each, dos2unix.pl, next last JMJS 09.4.24 1428
[1] [2]