Perl 형식의 출력


Perl은 매우 강력한 텍스트 데이터 처리 언어입니다.

Perl에서는 format을 사용하여 템플릿을 정의한 다음 write를 사용하여 지정된 템플릿에 따라 데이터를 출력할 수 있습니다.

Perl 형식 정의 구문은 다음과 같습니다.

format FormatName =
fieldline
value_one, value_two, value_three
fieldline
value_one, value_two
.

매개변수 분석:

  • FormatName: 형식 이름입니다.

  • fieldline: @,^,<,>,|와 같은 문자를 사용하여 출력 줄의 형식을 정의하는 데 사용되는 형식 줄입니다.

  • value_one, value_two...: 이전 형식 행에 값을 삽입하는 데 사용되는 데이터 행, 모두 Perl 변수입니다.

  • .: 끝 기호.

다음은 간단한 형식 지정 예입니다.

#!/usr/bin/perl

$text = "google php taobao";
format STDOUT =
first: ^<<<<<  # 左边对齐,字符长度为6
    $text
second: ^<<<<< # 左边对齐,字符长度为6
    $text
third: ^<<<< # 左边对齐,字符长度为5,taobao 最后一个 o 被截断
    $text  
.
write

위 예를 실행한 결과는 다음과 같습니다.

first: google
second: php
third: taoba

행 형식 지정(그래픽 선) 구문

  • 형식 행은 @ 또는 ^로 시작하며, 이러한 행은 어떤 형태의 변수 대체도 수행하지 않습니다.

  • @ 필드(배열 기호 @와 혼동하지 마세요)는 일반 필드입니다.

  • @,^ <, >,|의 길이에 따라 변수가 정의된 길이를 초과하면 잘립니다.

  • <, >,|는 각각 왼쪽 정렬, 오른쪽 정렬, 가운데 정렬을 나타냅니다.

  • ^ 필드는 여러 줄의 텍스트 블록을 채우는 데 사용됩니다.

값 필드 형식

값 필드 형식은 다음 표와 같습니다.

格式值域含义
@<<<左对齐输出
@>>>右对齐输出
@|||中对齐输出
@##.##  固定精度数字  
@*多行文本

각 값 필드의 첫 번째 문자는 줄 채우기 문자입니다. @ 문자를 사용하면 텍스트 서식이 적용되지 않습니다.

위 표에서 여러 줄 값 필드 @*를 제외하고 필드 너비는 @ 문자를 포함하여 지정된 문자 수와 같습니다. 예:

@###.##

는 7을 의미합니다. 문자 폭, 앞에 소수점 4자리, 뒤에 소수점 2자리.

예제는 다음과 같습니다.

#!/usr/bin/perl

format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<< 
$name $age
@#####.##
$salary
===================================
.

select(STDOUT);
$~ = EMPLOYEE;

@n = ("Ali", "php", "Jaffer");
@a  = (20,30, 40);
@s = (2000.00, 2500.00, 4000.000);

$i = 0;
foreach (@n){
	$name = $_;
	$age = $a[$i];
	$salary = $s[$i++];
	write;
}

위 예의 출력 결과는 다음과 같습니다.

===================================
Ali                     20
  2000.00
===================================
===================================
php                  30
  2500.00
===================================
===================================
Jaffer                  40
  4000.00
===================================

형식 변수

  • $~ ($ FORMAT_NAME): 형식 이름 $^ ($FORMAT_TOP_NAME): 현재 헤더 형식 이름이

  • $%에 저장됩니다. ($FORMAT_PAGE_NUMBER): 현재 출력 페이지 번호

  • $= ($FORMAT_LINES_PER_PAGE): 각 페이지의 줄 수

  • $| ($FORMAT_AUTOFLUSH): 출력 버퍼 저장소를 자동으로 새로 고칠지 여부

  • $^L ($FORMAT_FORMFEED) : 각 페이지(첫 번째 페이지 제외)의 헤더가

에 저장되기 전에 출력해야 하는 문자열은 다음과 같습니다. $~ 사용 방법 형식 지정 예:

#!/usr/bin/perl

$~ = "MYFORMAT"; # 指定缺省文件变量下所使用的格式
write;           # 输出 $~ 所指定的格式

format MYFORMAT = # 定义格式 MYFORMAT 
=================================
      Text # php中文网
=================================
.
write;

위 예제를 실행한 결과는 다음과 같습니다.

=================================
      Text # php中文网
=================================
=================================
      Text # php中文网
=================================

$~를 지정하지 않으면 STDOUT이라는 형식이 출력됩니다.

#!/usr/bin/perl

write;         # 不指定$~的情况下会寻找名为STDOUT的格式

format STDOUT =
~用~号指定的文字不会被输出
----------------
  STDOUT格式
----------------
.

위 예제를 실행한 결과는 다음과 같습니다.

----------------
  STDOUT格式
----------------

다음 예제에서는 보고서 헤더 정보를 추가하여 $^ 또는 $FORMAT_TOP_NAME 변수를 사용하는 방법을 보여줍니다.

#!/usr/bin/perl

format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<< 
$name $age
@#####.##
$salary
===================================
.

format EMPLOYEE_TOP =
===================================
Name                    Age
===================================
.

select(STDOUT);
$~ = EMPLOYEE;
$^ = EMPLOYEE_TOP;

@n = ("Ali", "php", "Jaffer");
@a  = (20,30, 40);
@s = (2000.00, 2500.00, 4000.000);

$i = 0;
foreach (@n){
   $name = $_;
   $age = $a[$i];
   $salary = $s[$i++];
   write;
}

위 예의 출력 결과는 다음과 같습니다.

===================================
Name                    Age
===================================
===================================
Ali                     20
  2000.00
===================================
===================================
php                  30
  2500.00
===================================
===================================
Jaffer                  40
  4000.00
===================================

$% 또는 $FORMAT_PAGE_NUMBER를 사용하여 보고서의 페이징을 설정할 수도 있습니다.

#!/usr/bin/perl

format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<< 
$name $age
@#####.##
$salary
===================================
.

# 添加分页 $% 
format EMPLOYEE_TOP =
===================================
Name                    Age Page @<
                                 $%
=================================== 
.

select(STDOUT);
$~ = EMPLOYEE;
$^ = EMPLOYEE_TOP;

@n = ("Ali", "php", "Jaffer");
@a  = (20,30, 40);
@s = (2000.00, 2500.00, 4000.000);

$i = 0;
foreach (@n){
   $name = $_;
   $age = $a[$i];
   $salary = $s[$i++];
   write;
}

위 예의 출력 결과는 다음과 같습니다.

===================================
Name                    Age Page 1
===================================
===================================
Ali                     20
  2000.00
===================================
===================================
php                  30
  2500.00
===================================
===================================
Jaffer                  40
  4000.00
===================================

다른 파일로 출력

기본적으로 쓰기 기능은 결과를 표준 출력 파일 STDOUT으로 출력하도록 할 수도 있습니다. 가장 간단한 방법은 파일 변수를 쓰기 매개변수로 전달하는 것입니다.

write(MYFILE);

위의 코드는 MYFILE이라는 기본 인쇄 형식을 사용하여 MYFILE 파일에 출력을 씁니다.

그러나 이 방법으로는 $~ 변수를 사용하여 사용된 인쇄 형식을 변경할 수 없습니다. 시스템 변수 $~는 기본 파일 변수에만 영향을 미칩니다. 기본 파일 변수를 변경하고 $~를 변경한 다음 쓰기를 호출할 수 있습니다.

#!/usr/bin/perl

if (open(MYFILE, ">tmp")) {
$~ = "MYFORMAT";
write MYFILE; # 含文件变量的输出,此时会打印与变量同名的格式,即MYFILE。$~里指定的值被忽略。

format MYFILE = # 与文件变量同名 
=================================
      输入到文件中
=================================
.
close MYFILE;
}

성공적으로 실행되면 아래와 같이 tmp 파일의 내용을 볼 수 있습니다.

$ cat tmp 
=================================
      输入到文件中
=================================

select를 사용하여 기본 파일 변수를 변경할 수 있으면 tmp 파일의 내부 표현이 반환됩니다. 현재 기본 파일 변수, 이런 방식으로 우리는 프로그램의 다른 부분에 영향을 주지 않고 우리 자신의 아이디어에 따라 서브루틴을 생성하고 출력할 수 있습니다.

#!/usr/bin/perl

if (open(MYFILE, ">>tmp")) {
select (MYFILE); # 使得默认文件变量的打印输出到MYFILE中
$~ = "OTHER";
write;           # 默认文件变量,打印到select指定的文件中,必使用$~指定的格式 OTHER

format OTHER =
=================================
  使用定义的格式输入到文件中
=================================
. 
close MYFILE;
}

성공적으로 실행되면 아래와 같이 tmp 파일의 내용을 볼 수 있습니다.

$ cat tmp 
=================================
      输入到文件中
=================================
=================================
  使用定义的格式输入到文件中
=================================