Perl ใช้ตัวแปรที่เรียกว่าประเภทการจัดการไฟล์เพื่อจัดการไฟล์
การอ่านหรือเขียนข้อมูลจากไฟล์จำเป็นต้องมีตัวจัดการไฟล์
ตัวจัดการไฟล์คือชื่อของการเชื่อมต่อ I/O
Perl มีตัวจัดการไฟล์สามตัว: STDIN, STDOUT และ STDERR ซึ่งแสดงถึงอินพุตมาตรฐาน เอาต์พุตมาตรฐาน และเอาต์พุตข้อผิดพลาดมาตรฐานตามลำดับ
คุณสามารถเปิดไฟล์ใน Perl ได้โดยใช้วิธีการต่อไปนี้:
เปิด FILEHANDLE, EXPRopen FILEHANDLE, FILENAME, MODE, PERMSsysopen FILEHANDLE, FILENAME, MODE
คำอธิบายพารามิเตอร์:
FILEHANDLE: ตัวจัดการไฟล์ ใช้เพื่อจัดเก็บตัวระบุไฟล์ที่ไม่ซ้ำกัน
EXPR: นิพจน์ที่ประกอบด้วยชื่อไฟล์และประเภทการเข้าถึงไฟล์
MODE: ประเภทการเข้าถึงไฟล์
PERMS: บิตการอนุญาตการเข้าถึง (บิตการอนุญาต)
ในโค้ดต่อไปนี้ เราใช้ฟังก์ชัน open เพื่อเปิดไฟล์ file.txt ในโหมดอ่านอย่างเดียว (<):
เปิด(ข้อมูล, "<file.txt");
< หมายถึงโหมดอ่านอย่างเดียว
ข้อมูลในโค้ดคือตัวจัดการไฟล์ที่ใช้ในการอ่านไฟล์ ตัวอย่างต่อไปนี้จะเปิดไฟล์และส่งออกเนื้อหาไฟล์:
รหัสต่อไปนี้เปิดไฟล์ file.txt สำหรับการเขียน ( > ):
open(DATA, ">file.txt") หรือ die "ไม่สามารถเปิดไฟล์ file.txt ได้, $!";
> ระบุวิธีการเขียน
หากคุณต้องการเปิดไฟล์เพื่ออ่านและเขียน คุณสามารถเพิ่มเครื่องหมาย + หน้าอักขระ > หรือ < ได้:
open(DATA, "+<file.txt"); หรือ die "ไฟล์ file.txt ไม่สามารถเปิดได้, $!";
วิธีการนี้จะไม่ลบเนื้อหาต้นฉบับของไฟล์ หากคุณต้องการลบ รูปแบบจะเป็นดังนี้:
เปิด DATA, "+>file.txt" หรือ die "ไม่สามารถเปิดไฟล์ file.txt ได้, $!";
หากคุณต้องการผนวกข้อมูลเข้ากับไฟล์ คุณจะต้องเปิดไฟล์ในโหมดผนวกก่อนที่จะผนวกข้อมูลเท่านั้น:
open(DATA,">>file.txt") ||. die "ไฟล์ file.txt ไม่สามารถเปิดได้, $!";
>> หมายถึงการต่อท้ายข้อมูลต่อท้ายไฟล์ที่มีอยู่ หากคุณต้องการอ่านเนื้อหาของไฟล์ที่จะต่อท้าย คุณสามารถเพิ่มเครื่องหมาย + ได้:
open(DATA,"+>>file.txt") ||. die "ไม่สามารถเปิดไฟล์ file.txt ได้, $!";
ตารางต่อไปนี้แสดงรายการโหมดการเข้าถึงต่างๆ:
| แบบอย่าง | อธิบาย |
|---|---|
| < หรือ ร | เปิดในโหมดอ่านอย่างเดียวและชี้ตัวชี้ไฟล์ไปที่ส่วนหัวของไฟล์ |
| > หรือ ว | เปิดในโหมดการเขียน ชี้ตัวชี้ไฟล์ไปที่ส่วนหัวของไฟล์ และตัดทอนขนาดไฟล์ให้เป็นศูนย์ หากไม่มีไฟล์อยู่ ให้ลองสร้างมันขึ้นมา |
| >> หรือก | เปิดในโหมดการเขียนและชี้ตัวชี้ไฟล์ไปที่ส่วนท้ายของไฟล์ หากไม่มีไฟล์อยู่ ให้ลองสร้างมันขึ้นมา |
| +< หรือ r+ | เปิดในโหมดอ่าน-เขียนและชี้ตัวชี้ไฟล์ไปที่ส่วนหัวของไฟล์ |
| +> หรือ w+ | เปิดในโหมดอ่าน-เขียน ชี้ตัวชี้ไฟล์ไปที่ส่วนหัวของไฟล์ และตัดขนาดไฟล์ให้เป็นศูนย์ หากไม่มีไฟล์อยู่ ให้ลองสร้างมันขึ้นมา |
| +>> หรือ a+ | เปิดในโหมดอ่าน-เขียนและชี้ตัวชี้ไฟล์ไปที่ส่วนท้ายของไฟล์ หากไม่มีไฟล์อยู่ ให้ลองสร้างมันขึ้นมา |
ฟังก์ชัน sysopen คล้ายกับฟังก์ชัน open ยกเว้นว่ารูปแบบพารามิเตอร์ต่างกัน
ตัวอย่างต่อไปนี้เปิดไฟล์สำหรับการอ่านและการเขียน (+<ชื่อไฟล์):
sysopen(ข้อมูล, "file.txt", O_RDWR);
หากคุณต้องการล้างไฟล์ก่อนทำการอัพเดต วิธีการเขียนจะเป็นดังนี้:
sysopen(ข้อมูล, "file.txt", O_RDWR|O_TRUNC );
คุณสามารถใช้ O_CREAT เพื่อสร้างไฟล์ใหม่ O_WRONLY เป็นโหมดเขียนอย่างเดียว O_RDONLY เป็นโหมดอ่านอย่างเดียว
พารามิเตอร์ PERMS เป็นค่าแอตทริบิวต์ฐานแปดซึ่งระบุสิทธิ์หลังจากการสร้างไฟล์ ค่าเริ่มต้นคือ 0x666
ตารางต่อไปนี้แสดงรายการค่าโหมดที่เป็นไปได้:
| แบบอย่าง | อธิบาย |
|---|---|
| O_RDWR | เปิดในโหมดอ่าน-เขียนและชี้ตัวชี้ไฟล์ไปที่ส่วนหัวของไฟล์ |
| O_RDONLY | เปิดในโหมดอ่านอย่างเดียวและชี้ตัวชี้ไฟล์ไปที่ส่วนหัวของไฟล์ |
| O_ผิดเลย | เปิดในโหมดการเขียน ชี้ตัวชี้ไฟล์ไปที่ส่วนหัวของไฟล์ และตัดทอนขนาดไฟล์ให้เป็นศูนย์ หากไม่มีไฟล์อยู่ ให้ลองสร้างมันขึ้นมา |
| O_CREAT | สร้างไฟล์ |
| O_APPEND | ต่อท้ายไฟล์ |
| O_TRUNC | ตัดขนาดไฟล์ให้เป็นศูนย์ |
| O_EXCL | หากไฟล์มีอยู่เมื่อใช้ O_CREAT ข้อความแสดงข้อผิดพลาดจะถูกส่งกลับ โดยสามารถทดสอบได้ว่ามีไฟล์อยู่หรือไม่ |
| O_NONBLOCK | I/O ที่ไม่บล็อกช่วยให้การดำเนินการของเราสำเร็จหรือส่งคืนข้อผิดพลาดทันทีโดยไม่ถูกบล็อก |
หลังจากใช้ไฟล์แล้ว ต้องปิดไฟล์เพื่อรีเฟรชบัฟเฟอร์อินพุตและเอาท์พุตที่เกี่ยวข้องกับตัวจัดการไฟล์ ไวยากรณ์สำหรับการปิดไฟล์จะเป็นดังนี้:
closeFILEHANDLEปิด
FILEHANDLE คือตัวจัดการไฟล์ที่ระบุ และส่งคืนค่าจริงหากปิดสำเร็จ
close(DATA) ||. die "ไม่สามารถปิดไฟล์";
มีหลายวิธีในการอ่านและเขียนข้อมูลลงในไฟล์:
วิธีการหลักในการอ่านข้อมูลจากตัวจัดการไฟล์ที่เปิดคือตัวดำเนินการ <FILEHANDLE> ในบริบทสเกลาร์ จะส่งกลับแถวเดียวจากตัวจัดการไฟล์ ตัวอย่างเช่น:
เมื่อเราใช้โอเปอเรเตอร์ <FILEHANDLE> มันจะส่งคืนรายการของแต่ละบรรทัดในตัวจัดการไฟล์ เช่น เราสามารถนำเข้าบรรทัดทั้งหมดลงในอาร์เรย์ได้
ใช้งานการสร้างไฟล์ import.txt ด้วยเนื้อหาต่อไปนี้:
$ cat import.txt 123
อ่าน import.txt และใส่แต่ละบรรทัดลงในอาร์เรย์ @lines:
เมื่อรันโปรแกรมข้างต้น ผลลัพธ์ที่ได้คือ:
123
ฟังก์ชัน xgetc ส่งคืนอักขระตัวเดียวจาก FILEHANDLE ที่ระบุ หรือ STDIN หากไม่ได้ระบุ:
getcFILEHANDLEgetc
หากมีข้อผิดพลาดเกิดขึ้น หรือตัวจัดการไฟล์อยู่ที่ส่วนท้ายของไฟล์ undef จะถูกส่งกลับ
ฟังก์ชัน read ใช้เพื่ออ่านข้อมูลจากตัวจัดการไฟล์ของบัฟเฟอร์
ฟังก์ชั่นนี้ใช้เพื่ออ่านข้อมูลไบนารีจากไฟล์
อ่าน FILEHANDLE, SCALAR, LENGTH, OFFSET อ่าน FILEHANDLE, SCALAR, LENGTH
คำอธิบายพารามิเตอร์:
FILEHANDLE: ตัวจัดการไฟล์ ใช้เพื่อจัดเก็บตัวระบุไฟล์ที่ไม่ซ้ำกัน
SCALAR: เก็บผลลัพธ์ หากไม่ได้ระบุ OFFSET ข้อมูลจะถูกวางไว้ที่จุดเริ่มต้นของ SCALAR มิฉะนั้นข้อมูลจะถูกวางไว้หลังไบต์ OFFSET ใน SCALAR
LENGTH: ความยาวของเนื้อหาที่อ่าน
ออฟเซ็ต: ออฟเซ็ต
ส่งกลับจำนวนไบต์ที่อ่านหากการอ่านสำเร็จ ส่งคืน 0 หากถึงจุดสิ้นสุดของไฟล์ และยกเลิกการกำหนดค่าหากเกิดข้อผิดพลาด
สำหรับฟังก์ชันทั้งหมดที่อ่านข้อมูลจากตัวจัดการไฟล์ ฟังก์ชันการเขียนหลักในส่วนหลังคือการพิมพ์:
พิมพ์ FILEHANDLE LISTพิมพ์ LISTprint
ผลลัพธ์ของการทำงานของโปรแกรมสามารถส่งไปยังอุปกรณ์เอาต์พุต (STDOUT: เอาต์พุตมาตรฐาน) โดยใช้ตัวจัดการไฟล์และฟังก์ชันการพิมพ์ ตัวอย่างเช่น:
พิมพ์ "สวัสดีชาวโลก!n";
ในตัวอย่างต่อไปนี้ เราจะเปิดไฟล์ที่มีอยู่ file1.txt อ่านแต่ละบรรทัดและเขียนลงในไฟล์ file2.txt:
ในตัวอย่างต่อไปนี้ เราเปลี่ยนชื่อไฟล์ที่มีอยู่ file1.txt เป็น file2.txt และไดเร็กทอรีที่ระบุอยู่ภายใต้ /usr/codercto/test/:
#!/usr/bin/perlrename ("/usr/codercto/test/file1.txt", "/usr/codercto/test/file2.txt" );ฟังก์ชั่น การเปลี่ยนชื่อ ยอมรับเพียงสองพารามิเตอร์และเปลี่ยนชื่อไฟล์ที่มีอยู่เท่านั้น
ตัวอย่างต่อไปนี้สาธิตวิธีการใช้ฟังก์ชัน ยกเลิกการเชื่อมโยง เพื่อลบไฟล์:
คุณสามารถรับตำแหน่งของไฟล์ได้โดยใช้ฟังก์ชัน tell และระบุตำแหน่งภายในไฟล์โดยใช้ฟังก์ชัน search :
ฟังก์ชั่น tell ใช้เพื่อรับตำแหน่งไฟล์:
บอก FILEHANDLE บอก
ถ้าระบุ FILEHANDLE ฟังก์ชันนี้จะส่งคืนตำแหน่งของตัวชี้ไฟล์เป็นไบต์ หากไม่ได้ระบุ จะส่งคืนหมายเลขอ้างอิงไฟล์ที่เลือกเป็นค่าเริ่มต้น
ฟังก์ชัน Seek() อ่านหรือเขียนไฟล์โดยการย้ายตัวชี้การอ่าน-เขียนไฟล์ผ่านตัวจัดการไฟล์ และอ่านและเขียนเป็นไบต์:
แสวงหา FILEHANDLE ตำแหน่ง WHENCE
คำอธิบายพารามิเตอร์:
FILEHANDLE: ตัวจัดการไฟล์ ใช้เพื่อจัดเก็บตัวระบุไฟล์ที่ไม่ซ้ำกัน
ตำแหน่ง: ระบุจำนวนไบต์ที่จะย้ายโดยตัวจัดการไฟล์ (ตัวชี้ตำแหน่งการอ่านและเขียน)
โดยที่: ระบุตำแหน่งเริ่มต้นเมื่อตัวจัดการไฟล์ (ตัวชี้ตำแหน่งอ่าน-เขียน) เริ่มเคลื่อนที่ ค่าที่เป็นไปได้คือ 0, 1 และ 2 โดยระบุจุดเริ่มต้นของไฟล์ ตำแหน่งปัจจุบัน และจุดสิ้นสุดของ ไฟล์ตามลำดับ
ตัวอย่างต่อไปนี้อ่าน 256 ไบต์จากจุดเริ่มต้นของไฟล์:
ค้นหาข้อมูล, 256, 0;
การดำเนินการกับไฟล์ของ Perl ยังสามารถทดสอบก่อนว่ามีไฟล์อยู่หรือไม่ สามารถอ่านและเขียนได้หรือไม่ เป็นต้น
ก่อนอื่นเราสามารถสร้างไฟล์ file1.txt ได้ดังนี้:
$ cat file1.txt www.codercto.com
เมื่อรันโปรแกรมข้างต้น ผลลัพธ์ที่ได้คือ:
ข้อมูล file1.txt: เป็นไฟล์ข้อความขนาด 15 ไบต์
ตัวดำเนินการทดสอบไฟล์จะแสดงในตารางต่อไปนี้:
| ผู้ดำเนินการ | อธิบาย |
|---|---|
| -ก | เวลาที่เข้าถึงไฟล์ครั้งล่าสุด (หน่วย: วัน) |
| -บี | มันเป็นไฟล์ไบนารี่หรือไม่? |
| -ค | เวลาแก้ไขโหนดดัชนีไฟล์ (ไอโหนด) (หน่วย: วัน) |
| -ม | เวลาที่แก้ไขไฟล์ครั้งล่าสุด (หน่วย: วัน) |
| -โอ | ไฟล์เป็นของ UID จริง |
| -ร | ไฟล์หรือไดเร็กทอรีสามารถอ่านได้ด้วย UID/GID จริง |
| -ส | สำหรับเต้ารับ (เต้ารับ) |
| -ต | มันเป็นไฟล์ข้อความหรือไม่? |
| -ว | ไฟล์หรือไดเร็กทอรีสามารถเขียนด้วย UID/GID จริงได้ |
| -เอ็กซ์ | ไฟล์หรือไดเร็กทอรีสามารถดำเนินการได้ด้วย UID/GID จริง |
| -ข | สำหรับไฟล์บล็อกพิเศษ (บล็อกพิเศษ) (เช่น ดิสก์ที่เมาท์) |
| -ค | สำหรับไฟล์อักขระพิเศษ (อักขระพิเศษ) (เช่น อุปกรณ์ I/O) |
| -d | สำหรับไดเรกทอรี |
| -e | มีชื่อไฟล์หรือไดเร็กทอรีอยู่ |
| -ฉ | สำหรับไฟล์ธรรมดา |
| -ก | ไฟล์หรือไดเรกทอรีมีแอตทริบิวต์ setgid |
| -เค | ไฟล์หรือไดเร็กทอรีมีชุดบิตเหนียว |
| -ล | สำหรับลิงค์สัญลักษณ์ |
| -o | ไฟล์เป็นของ UID ที่ถูกต้อง |
| -พี | ไฟล์นี้เป็นไปป์ที่มีชื่อ (FIFO) |
| -ร | ไฟล์สามารถอ่านได้ด้วย UID/GID ที่ถูกต้อง |
| -ส | มีไฟล์หรือไดเร็กทอรีอยู่และไม่ใช่ 0 (ส่งคืนจำนวนไบต์) |
| -t | ตัวจัดการไฟล์คือ TTY (ผลลัพธ์ที่ส่งคืนของฟังก์ชันระบบ isatty() การทดสอบนี้ไม่สามารถใช้กับชื่อไฟล์ได้) |
| -คุณ | ไฟล์หรือไดเรกทอรีมีแอตทริบิวต์ setuid |
| -ว | ไฟล์สามารถเขียนด้วย UID/GID ที่ถูกต้อง |
| -x | ไฟล์สามารถดำเนินการได้ด้วย UID/GID ที่ถูกต้อง |
| -z | ไฟล์มีอยู่และมีขนาดเป็น 0 (ไดเร็กทอรีจะเป็นเท็จเสมอ) นั่นคือไม่ว่าจะเป็นไฟล์เปล่าหรือไม่ |