Cara membaca file teks di Perl

Tugas. Ada sebuah file teks. Anda perlu untuk memuat isinya ke dalam sebuah variabel skalar dalam program Perl.

Masalah tersebut muncul cukup sering. Misalnya, masalah tersebut mungkin terjadi membaca file konfigurasi atau file data kecil. Jika anda perlu untuk memproses file besar, lebih baik untuk tidak menggunakan metode ini, dan untuk menggunakan stream membaca dari sebuah file.

Solusi. Untuk menggunakan library Path::Kecil

Yang paling sederhana dan paling nyaman solusi adalah dengan menggunakan Perl library Path::Kecil

#!/usr/bin/perl

use strict;
use warnings FATAL => 'all';
use utf8;
use open qw(:std :utf8);

use Path::Tiny;

my $file_name = 'a.txt';

my $content = path($file_name)->slurp_utf8();

print $content;

Di sini path('a.txt') menciptakan sebuah objek dari kelas Jalan::Kecil, dan ->slurp_utf8() panggilan metode slurp_utf8 objek ini. Hasilnya dalam variabel $content Muncul semua isi dari file tersebut.

Ini adalah solusi yang baik, tapi ada satu kehalusan. Library Path::Kecil tidak dengan Perl, itu harus diletakkan secara terpisah. Biasanya hal ini menyebabkan tidak ada masalah, tetapi dalam beberapa situasi, solusi ini tidak cocok.

Solusi. Untuk membaca file dengan alat-alat standar Perl

Solusi ini tidak begitu nyaman dengan menggunakan library Path::Kecil, saya memiliki lebih banyak untuk menulis, tetapi tidak memerlukan instalasi tambahan perpustakaan.

#!/usr/bin/perl

use strict;
use warnings FATAL => 'all';
use utf8;
use open qw(:std :utf8);

my $file_name = 'a.txt';

my $content = '';

open FILE, '<', $file_name or die $!;

while (<FILE>) {
    $content .= $_;
}

print $content;

Menggunakan open kita buat file handler FILE. Ketika bekerja dengan open hal ini penting untuk menggunakan tiga argumen dan hal ini sangat penting untuk menulis or die, tidak || die. Kemudian dengan bantuan while (<FILE>) kami berjalan di sekitar file baris demi baris dan mengumpulkan semua konten ke dalam variabel $content.

Awalnya, kami ditugaskan variabel $content baris kosong ''. Hal ini diperlukan dalam rangka untuk membuat kode bekerja dengan benar dalam kasus file kosong (jika anda tidak menetapkan string kosong, dalam kasus file kosong dalam variabel $content akan undef).

Yang sangat berbahaya keputusan. Gunakan cat

Berikut adalah cara lain anda dapat membaca isi file ke dalam sebuah variabel. Solusi ini tidak memerlukan library tambahan dan tidak memerlukan menulis banyak baris kode, tapi ini adalah solusi spike. Yang terbaik adalah tidak pernah menulis. Satu-satunya cara untuk melakukan ini adalah ketika proyek tidak memiliki Path::Tany, aktif bekerja dan untuk memeriksa bagian-bagian lain dari program ini butuh cepat kode yang membaca file. Tapi dalam kasus ini, anda perlu berikutnya meninggalkan komentar # TODO dan pada kesempatan pertama untuk menghapus kode ini.

#!/usr/bin/perl

use strict;
use warnings FATAL => 'all';
use utf8;
use open qw(:std :utf8);

my $file_name = 'a.txt';

my $content = `cat $file_name`;

print $content;

Mengapa ini adalah keputusan yang buruk. Pertama tidak ada kesalahan penanganan. Jika file tidak ada, maka STDERR akan menerima peringatan cat: asdf: No such file or directory, tetapi program akan pergi lebih jauh. Kedua, itu tidak akan bekerja jika nama file memiliki ruang. Ketiga, jika isi dari variabel $file_name kita dapatkan di luar sana adalah kesempatan yang ada akan menjadi sesuatu seperti a.txt; rm -rf / dan selain untuk membaca file masih akan dieksekusi tindakan tidak aman.

Artikel lainnya