Perl - Tệp I / O

Những điều cơ bản về xử lý tệp rất đơn giản: bạn liên kết filehandle với một thực thể bên ngoài (thường là một tệp) và sau đó sử dụng nhiều toán tử và hàm trong Perl để đọc và cập nhật dữ liệu được lưu trữ trong luồng dữ liệu được liên kết với xử lý tệp.

Xử lý tệp là cấu trúc Perl nội bộ được đặt tên liên kết tệp vật lý với một tên. Tất cả các bộ xử lý tệp đều có khả năng truy cập đọc / ghi, vì vậy bạn có thể đọc và cập nhật bất kỳ tệp hoặc thiết bị nào được liên kết với một bộ xử lý tệp. Tuy nhiên, khi bạn kết hợp một xử lý tệp, bạn có thể chỉ định chế độ mà xử lý tệp được mở.

Ba trình xử lý tệp cơ bản là - STDIN, STDOUTSTDERR, đại diện cho đầu vào tiêu chuẩn, đầu ra tiêu chuẩn và thiết bị lỗi tiêu chuẩn tương ứng.

Mở và đóng tệp

Có hai hàm sau với nhiều biểu mẫu, có thể được sử dụng để mở bất kỳ tệp mới hoặc hiện có nào trong Perl.

open FILEHANDLE, EXPR
open FILEHANDLE

sysopen FILEHANDLE, FILENAME, MODE, PERMS
sysopen FILEHANDLE, FILENAME, MODE

Ở đây FILEHANDLE là trình xử lý tệp được trả về open hàm và EXPR là biểu thức có tên tệp và chế độ mở tệp.

Mở chức năng

Sau đây là cú pháp để mở file.txtở chế độ chỉ đọc. Ở đây dấu nhỏ hơn <chỉ ra rằng tệp phải được mở ở chế độ chỉ đọc.

open(DATA, "<file.txt");

Ở đây DATA là trình xử lý tệp, sẽ được sử dụng để đọc tệp. Đây là ví dụ, sẽ mở một tệp và sẽ in nội dung của tệp đó ra màn hình.

#!/usr/bin/perl

open(DATA, "<file.txt") or die "Couldn't open file file.txt, $!";

while(<DATA>) {
   print "$_";
}

Sau đây là cú pháp để mở file.txt ở chế độ ghi. Ở đây dấu nhỏ hơn> chỉ ra rằng tệp phải được mở trong chế độ ghi.

open(DATA, ">file.txt") or die "Couldn't open file file.txt, $!";

Ví dụ này thực sự cắt bớt (làm trống) tệp trước khi mở để viết, điều này có thể không mang lại hiệu quả mong muốn. Nếu bạn muốn mở một tệp để đọc và viết, bạn có thể đặt một dấu cộng trước các ký tự> hoặc <.

Ví dụ: để mở một tệp để cập nhật mà không cắt ngắn nó -

open(DATA, "+<file.txt"); or die "Couldn't open file file.txt, $!";

Để cắt ngắn tệp trước tiên -

open DATA, "+>file.txt" or die "Couldn't open file file.txt, $!";

Bạn có thể mở tệp ở chế độ nối thêm. Trong chế độ này, điểm ghi sẽ được đặt ở cuối tệp.

open(DATA,">>file.txt") || die "Couldn't open file file.txt, $!";

Dấu đúp >> mở tệp để bổ sung, đặt con trỏ tệp ở cuối để bạn có thể bắt đầu ngay lập tức thông tin bổ sung. Tuy nhiên, bạn không thể đọc từ nó trừ khi bạn cũng đặt một dấu cộng trước nó -

open(DATA,"+>>file.txt") || die "Couldn't open file file.txt, $!";

Sau đây là bảng, cung cấp các giá trị có thể có của các chế độ khác nhau

Sr.No. Thực thể & Định nghĩa
1

< or r

Quyền truy cập chỉ đọc

2

> or w

Sáng tạo, Viết và Cắt bớt

3

>> or a

Viết, bổ sung và sáng tạo

4

+< or r+

Đọc và Viết

5

+> or w+

Đọc, Viết, Sáng tạo và Cắt bớt

6

+>> or a+

Đọc, Viết, Thêm và Sáng tạo

Chức năng Sysopen

Các sysopen chức năng tương tự như chức năng mở chính, ngoại trừ việc nó sử dụng hệ thống open() chức năng, sử dụng các tham số được cung cấp cho nó làm tham số cho chức năng hệ thống -

Ví dụ: để mở một tệp để cập nhật, mô phỏng +<filename định dạng từ mở -

sysopen(DATA, "file.txt", O_RDWR);

Hoặc cắt bớt tệp trước khi cập nhật -

sysopen(DATA, "file.txt", O_RDWR|O_TRUNC );

Bạn có thể sử dụng O_CREAT để tạo tệp mới và O_WRONLY- để mở tệp ở chế độ chỉ ghi và O_RDONLY - để mở tệp ở chế độ chỉ đọc.

Các PERMSđối số chỉ định các quyền đối với tệp được chỉ định, nếu nó phải được tạo. Theo mặc định, nó mất0x666.

Sau đây là bảng, cung cấp các giá trị có thể có của MODE.

Sr.No. Thực thể & Định nghĩa
1

O_RDWR

Đọc và viết

2

O_RDONLY

Chỉ đọc

3

O_WRONLY

Chỉ viết

4

O_CREAT

Tạo tệp

5

O_APPEND

Nối tệp

6

O_TRUNC

Cắt ngắn tệp

7

O_EXCL

Dừng nếu tệp đã tồn tại

số 8

O_NONBLOCK

Khả năng sử dụng không chặn

Đóng chức năng

Để đóng một trình xử lý tệp, và do đó ngắt liên kết xử lý tệp khỏi tệp tương ứng, bạn sử dụng closechức năng. Thao tác này xóa bộ đệm của bộ xử lý tệp và đóng bộ mô tả tệp của hệ thống.

close FILEHANDLE
close

Nếu không có FILEHANDLE nào được chỉ định, thì nó sẽ đóng xử lý tệp hiện đang được chọn. Nó chỉ trả về true nếu nó có thể xóa thành công bộ đệm và đóng tệp.

close(DATA) || die "Couldn't close file properly";

Đọc và ghi tệp

Khi bạn đã có một bộ xử lý tệp mở, bạn cần có khả năng đọc và ghi thông tin. Có một số cách khác nhau để đọc và ghi dữ liệu vào tệp.

Toán tử <FILEHANDL>

Phương pháp chính để đọc thông tin từ một trình xử lý tệp đang mở là toán tử <FILEHANDLE>. Trong ngữ cảnh vô hướng, nó trả về một dòng từ tệp xử lý. Ví dụ -

#!/usr/bin/perl

print "What is your name?\n";
$name = <STDIN>;
print "Hello $name\n";

Khi bạn sử dụng toán tử <FILEHANDLE> trong ngữ cảnh danh sách, nó sẽ trả về một danh sách các dòng từ xử lý tệp được chỉ định. Ví dụ, để nhập tất cả các dòng từ một tệp vào một mảng -

#!/usr/bin/perl

open(DATA,"<import.txt") or die "Can't open data";
@lines = <DATA>;
close(DATA);

Hàm getc

Hàm getc trả về một ký tự đơn từ FILEHANDLE hoặc STDIN được chỉ định nếu không có ký tự nào được chỉ định -

getc FILEHANDLE
getc

Nếu có lỗi hoặc tệp xử lý ở cuối tệp, thì thay vào đó, undef sẽ được trả về.

đọc Chức năng

Hàm read đọc một khối thông tin từ xử lý tệp được đệm: Hàm này được sử dụng để đọc dữ liệu nhị phân từ tệp.

read FILEHANDLE, SCALAR, LENGTH, OFFSET
read FILEHANDLE, SCALAR, LENGTH

Độ dài của dữ liệu đọc được xác định bởi LENGTH và dữ liệu được đặt ở đầu SCALAR nếu không có OFFSET được chỉ định. Nếu không, dữ liệu được đặt sau byte OFFSET trong SCALAR. Hàm trả về số byte được đọc khi thành công, số không ở cuối tệp hoặc hoàn tác nếu có lỗi.

chức năng in

Đối với tất cả các phương pháp khác nhau được sử dụng để đọc thông tin từ các bộ xử lý tệp, chức năng chính để ghi lại thông tin là chức năng in.

print FILEHANDLE LIST
print LIST
print

Chức năng in sẽ in giá trị được đánh giá của LIST tới FILEHANDLE, hoặc tới bộ xử lý tệp đầu ra hiện tại (STDOUT theo mặc định). Ví dụ -

print "Hello World!\n";

Sao chép các tập tin

Đây là ví dụ, mở một tệp hiện có file1.txt và đọc từng dòng một và tạo một bản sao tệp khác file2.txt.

#!/usr/bin/perl

# Open file to read
open(DATA1, "<file1.txt");

# Open new file to write
open(DATA2, ">file2.txt");

# Copy data from one file to another.
while(<DATA1>) {
   print DATA2 $_;
}
close( DATA1 );
close( DATA2 );

Đổi tên tệp

Đây là một ví dụ cho thấy cách chúng ta có thể đổi tên tệp file1.txt thành file2.txt. Giả sử tệp có sẵn trong thư mục / usr / test.

#!/usr/bin/perl

rename ("/usr/test/file1.txt", "/usr/test/file2.txt" );

Chức năng này renames nhận hai đối số và nó chỉ đổi tên tệp hiện có.

Xóa một tệp hiện có

Đây là một ví dụ cho thấy cách xóa tệp file1.txt bằng cách sử dụng unlink chức năng.

#!/usr/bin/perl

unlink ("/usr/test/file1.txt");

Định vị bên trong tệp

Bạn có thể sử dụng để tell chức năng để biết vị trí hiện tại của tệp và seek hàm để trỏ một vị trí cụ thể bên trong tệp.

nói với chức năng

Yêu cầu đầu tiên là tìm vị trí của bạn trong một tệp, mà bạn thực hiện bằng cách sử dụng chức năng cho biết -

tell FILEHANDLE
tell

Điều này trả về vị trí của con trỏ tệp, tính bằng byte, trong FILEHANDLE nếu được chỉ định hoặc xử lý tệp được chọn mặc định hiện tại nếu không có tệp nào được chỉ định.

Tìm kiếm chức năng

Hàm tìm kiếm định vị con trỏ tệp đến số byte được chỉ định trong tệp -

seek FILEHANDLE, POSITION, WHENCE

Hàm này sử dụng hàm hệ thống fseek, và bạn có cùng khả năng xác định vị trí liên quan đến ba điểm khác nhau: điểm bắt đầu, điểm kết thúc và vị trí hiện tại. Bạn thực hiện việc này bằng cách chỉ định một giá trị cho WHENCE.

Số không thiết lập vị trí liên quan đến đầu tệp. Ví dụ: dòng đặt con trỏ tệp thành byte thứ 256 trong tệp.

seek DATA, 256, 0;

Thông tin tệp

Bạn có thể kiểm tra các tính năng nhất định rất nhanh trong Perl bằng cách sử dụng một loạt các toán tử kiểm tra được gọi chung là kiểm tra -X. Ví dụ: để thực hiện kiểm tra nhanh các quyền khác nhau trên một tệp, bạn có thể sử dụng một tập lệnh như sau -

#/usr/bin/perl

my $file = "/usr/test/file1.txt";
my (@description, $size);
if (-e $file) {
   push @description, 'binary' if (-B _);
   push @description, 'a socket' if (-S _);
   push @description, 'a text file' if (-T _);
   push @description, 'a block special file' if (-b _);
   push @description, 'a character special file' if (-c _);
   push @description, 'a directory' if (-d _);
   push @description, 'executable' if (-x _);
   push @description, (($size = -s _)) ? "$size bytes" : 'empty';
   print "$file is ", join(', ',@description),"\n";
}

Đây là danh sách các tính năng mà bạn có thể kiểm tra tệp hoặc thư mục -

Sr.No. Toán tử & Định nghĩa
1

-A

Thời gian bắt đầu tập lệnh trừ thời gian truy cập tệp cuối cùng, tính bằng ngày.

2

-B

Nó có phải là một tệp nhị phân không?

3

-C

Thời gian bắt đầu tập lệnh trừ thời gian thay đổi inode cuối cùng của tệp, tính bằng ngày.

3

-M

Thời gian bắt đầu tập lệnh trừ thời gian sửa đổi tệp, tính bằng ngày.

4

-O

Tệp có thuộc sở hữu của ID người dùng thực không?

5

-R

Tệp có thể đọc được bởi ID người dùng thực hay nhóm thực?

6

-S

Tệp có phải là ổ cắm không?

7

-T

Nó là một tập tin văn bản?

số 8

-W

Tệp có thể được ghi bởi ID người dùng thực hay nhóm thực?

9

-X

Tệp được thực thi bởi ID người dùng thực hay nhóm thực?

10

-b

Nó có phải là một tập tin đặc biệt khối không?

11

-c

Nó có phải là một tập tin đặc biệt không?

12

-d

Tệp có phải là một thư mục không?

13

-e

Tệp có tồn tại không?

14

-f

Nó là một tập tin đơn giản?

15

-g

Tệp có đặt bit setgid không?

16

-k

Tệp có tập hợp bit dính không?

17

-l

Tệp có phải là một liên kết tượng trưng không?

18

-o

Tệp có thuộc sở hữu của ID người dùng hiệu quả không?

19

-p

Tệp có phải là một đường ống được đặt tên không?

20

-r

Tệp có thể đọc được bằng ID nhóm hoặc người dùng hiệu quả không?

21

-s

Trả về kích thước của tệp, kích thước bằng không = tệp trống.

22

-t

Tập tin có được mở bằng TTY (thiết bị đầu cuối) không?

23

-u

Tệp có tập hợp bit setuid không?

24

-w

Tệp có thể ghi bởi người dùng hoặc ID nhóm hiệu quả không?

25

-x

Tệp có được thực thi bởi người dùng hoặc ID nhóm hiệu quả không?

26

-z

Kích thước tệp có bằng không?