2013년 9월 10일 화요일

Perl 제대로 배우기 - 11장 (Format)

11. Format
포맷이란 ?
펄은 리포트 언어다? 리포트 언어라고 불리는 이유에 대해서 배운다.
포맷의 사용은 구성
  1. 포맷 정의하기
  2. 출력되어질 데이터를 포맷의 가변부(필드)로 로드하기
  3. 포맷 호출하기

포맷 정의하기
format 선언을 통해서 정의됨. format 선언은 서브루틴과 마찬가지로 프로그램 텍스트의 임의의 장소에 존재 할 수 있다.
format 정의 모양
format someformatname =
fieldline
value_one,value_two,value_three
fieldline
value_one,value_two
fieldline
value_one,value_two,value_three
.

**포맷이름은 파일핸들 이름과 동일하다.
첫번째 행 다음은 0 혹은 그 이상은 텍스트 행으로 구성됨 템플릿이 온다.(템플릿은 여백에 민감하다.)
예)
Hello, my name is @<<<<<<<<<<< :: @<<<<<<<<<<< 는 필드 홀더라고 부른다. 11 문자이면 왼쪽 맞춤 정렬이다.
$name
** 값 행 내의 여백은 무시된다.

실제 포맷 정의
format ADDRESSLABEL =
=============================
|  @<<<<<<<<<<<<<<<<<<<<<<  |
$name
|  @<<<<<<<<<<<<<<<<<<<<<<  |
$address
|  @<<<<<<<<<<<<, @< @<<<<  |
$city,$state,$zip
============================
.

포맷의 호출
포맷은 write 함수로 호출됨.
이 함수는 파일핸들의 이름을 받아서 그 파일 핸들에 대한 현재 포맷을 사용하여 파일 핸들에 대한 텍스트를 생성한다. 디폴트로 파일핸들에 대한 현재 포맷은 동일한 이름의 포맷(STDOUT)
** 파일핸들 이름은 포맷의 이름과 동일함을 주목하라.

open (ADDRESSLABEL,">labels-to-print") || die "can't create";
open (ADDRESSES,"addresses") || die "cannot open addresses";
while (<ADDRESSES>){
       chomp;
       ($name,$address,$city,$state,$zip) = split(/:/);
       write (ADDRESSLABEL);   #출력을 보냄
}

필드홀더에 대한 상세
필드홀더는 @으로 시작한다.
<<<<< :: 왼쪽 맞춤
>>>>> :: 오른쪽 맞춤
||||| :: 중앙 맞춤

산술필드
@로 시작 하나 이상의 # 과 마침표(optional)

복수행 필드
일반적으로 값의 첫번째 뉴라인에서 멈춘다.
@*

충전필드 (filled field) : 채우는 역할을 수행 한다.
@ 대신 ^ (캐럿)을 대신 사용함.
~ : 억제 지시자 , 임의의 행은 그것이 빈행으로 출력되지 않도록 한다.
~~ : 임의행에 대해서 처리 한다. 즉 4개행이 넘어도 가능
예) 여기서 원래 PEOPLE을 STDOUT으로 일부려 변경 했음.
format STDOUT =
Name: @<<<<<<<<<<<< Comment: ^<<<<<<<<<<<<<<<<<<<<<<<<<<<
$name, $comment
~                            ^<<<<<<<<<<<<<<<<<<<<<<<<<<<
$comment
~                            ^<<<<<<<<<<<<<<<<<<<<<<<<<<<
$comment
~                            ^<<<<<<<<<<<<<<<<<<<<<<<<<<<
$comment
.
무한행이 되어도 만족한다.
format STDOUT =
Name: @<<<<<<<<<<<< Comment: ^<<<<<<<<<<<<<<<<<<<<<<<<<<<
$name, $comment
~~                            ^<<<<<<<<<<<<<<<<<<<<<<<<<<<
$comment
.

Top-of-Page 포맷
포맷이름에 _TOP 이 붙은 파일 핸드 이름이다.
디폴트 페이지 길이는 60행

포맷에 대한 디폴트 변경
select()를 이용한 파일 핸들 바꾸기
- STDOUT print에 대해 디폴트이기 때문이다.
select 연산은 점착성이 있음. 다른것을 선택하기 전까지는 지속성이 있다.
select 함수의 리턴값은 이전에 선택된 핸들의 이름이다.
예)
$oldhandle = select (LOGFILE);
print “this goes to LOGFILE\n”;
select ($oldhandle);

포맷이름 바꾸기
특정 파일핸들에 대한 디폴트 포맷이름은 파일핸들과 동일하다.
$~ :: 특별 변수 현재 선택된 파일핸들
Top-of-page 포맷이름 바꾸기
$^ :: top-of-page 포맷을 바꿀 수 있다.
$= :: 페이지 길이 변경
$- :: 페이지 위치 변경

댓글 없음: