Perl - Định dạng

Perl sử dụng một mẫu viết được gọi là 'định dạng' để xuất báo cáo. Để sử dụng tính năng định dạng của Perl, trước tiên bạn phải xác định một định dạng và sau đó bạn có thể sử dụng định dạng đó để ghi dữ liệu được định dạng.

Xác định một định dạng

Sau đây là cú pháp để xác định định dạng Perl:

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

Đây FormatNameđại diện cho tên của định dạng. Cácfieldlinelà cách cụ thể, dữ liệu nên được định dạng. Các dòng giá trị đại diện cho các giá trị sẽ được nhập vào dòng trường. Bạn kết thúc định dạng bằng một dấu chấm.

Kế tiếp fieldlinecó thể chứa bất kỳ văn bản hoặc trình giữ trường nào. Các trường giữ chỗ cho dữ liệu sẽ được đặt ở đó vào một ngày sau đó. Một trường có định dạng -

@<<<<

Trường giữ nguyên này được căn trái, với khoảng trống trường là 5. Bạn phải đếm dấu @ và dấu <để biết số lượng khoảng trắng trong trường. Những người nắm giữ lĩnh vực khác bao gồm -

@>>>> right-justified
@|||| centered
@####.## numeric field holder
@* multiline field holder

Một định dạng ví dụ sẽ là -

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

Trong ví dụ này, $ name sẽ được viết sang trái trong khoảng cách 22 ký tự và sau tuổi đó sẽ được viết trong hai khoảng trắng.

Sử dụng Định dạng

Để gọi khai báo định dạng này, chúng tôi sẽ sử dụng write từ khóa -

write EMPLOYEE;

Vấn đề là tên định dạng thường là tên của một xử lý tệp đang mở và câu lệnh write sẽ gửi kết quả đến xử lý tệp này. Vì chúng ta muốn dữ liệu được gửi đến STDOUT, chúng ta phải kết hợp EMPLOYEE với bộ xử lý tệp STDOUT. Tuy nhiên, trước tiên, chúng ta phải đảm bảo rằng STDOUT là tệp xử lý đã chọn của chúng ta, bằng cách sử dụng hàm select ().

select(STDOUT);

Sau đó, chúng tôi sẽ liên kết EMPLOYEE với STDOUT bằng cách đặt tên định dạng mới với STDOUT, sử dụng biến đặc biệt $ ~ hoặc $ FORMAT_NAME như sau:

$~ = "EMPLOYEE";

Khi chúng ta thực hiện write (), dữ liệu sẽ được gửi đến STDOUT. Hãy nhớ rằng: nếu bạn định viết báo cáo của mình trong bất kỳ trình xử lý tệp nào khác thay vì STDOUT thì bạn có thể sử dụng hàm select () để chọn xử lý tệp đó và phần còn lại của logic sẽ được giữ nguyên.

Hãy lấy ví dụ sau đây. Ở đây chúng tôi có các giá trị được mã hóa cứng chỉ để hiển thị cách sử dụng. Trong cách sử dụng thực tế, bạn sẽ đọc các giá trị từ tệp hoặc cơ sở dữ liệu để tạo báo cáo thực tế và bạn có thể cần viết lại báo cáo cuối cùng vào tệp.

#!/usr/bin/perl

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

select(STDOUT);
$~ = EMPLOYEE;

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

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

Khi được thực thi, điều này sẽ tạo ra kết quả sau:

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

Xác định Tiêu đề Báo cáo

Mọi thứ có vẻ ổn. Nhưng bạn sẽ quan tâm đến việc thêm tiêu đề vào báo cáo của mình. Tiêu đề này sẽ được in trên đầu mỗi trang. Nó rất đơn giản để làm điều này. Ngoài việc xác định một mẫu, bạn sẽ phải xác định một tiêu đề và gán nó cho biến $ ^ hoặc $ FORMAT_TOP_NAME -

#!/usr/bin/perl

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

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

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

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

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

Bây giờ báo cáo của bạn sẽ giống như -

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

Xác định phân trang

Còn nếu báo cáo của bạn chiếm nhiều hơn một trang thì sao? Bạn có một giải pháp cho điều đó, chỉ cần sử dụng$% hoặc $ FORMAT_PAGE_NUMBER có thể chạy được cùng với tiêu đề như sau -

format EMPLOYEE_TOP =
===================================
Name                    Age Page @<
                                 $%
===================================                               
.

Bây giờ đầu ra của bạn sẽ giống như sau:

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

Số dòng trên một trang

Bạn có thể đặt số dòng trên mỗi trang bằng cách sử dụng biến đặc biệt $= (hoặc $ FORMAT_LINES_PER_PAGE), Theo mặc định $ = sẽ là 60.

Xác định Chân trang Báo cáo

Mặc dù $ ^ hoặc $ FORMAT_TOP_NAME chứa tên của định dạng tiêu đề hiện tại, nhưng không có cơ chế tương ứng nào để tự động làm điều tương tự cho chân trang. Nếu bạn có chân trang có kích thước cố định, bạn có thể lấy chân trang bằng cách kiểm tra biến $ - hoặc $ FORMAT_LINES_LEFT trước mỗi lần write () và tự in chân trang nếu cần bằng cách sử dụng định dạng khác được xác định như sau:

format EMPLOYEE_BOTTOM =
End of Page @<
            $%
.

Để có tập hợp đầy đủ các biến liên quan đến việc định dạng, vui lòng tham khảo phần Biến Đặc biệt Perl .