Saya mencoba membuka file .html sebagai satu string panjang yang besar. Inilah yang saya punya:
open(FILE, 'index.html') or die "Can't read file 'filename' [$!]\n";
$document = <FILE>;
close (FILE);
print $document;
yang mengakibatkan:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN
Namun, saya ingin hasilnya terlihat seperti:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
Dengan cara ini saya dapat mencari seluruh dokumen dengan lebih mudah.
Jawaban:
Menambahkan:
sebelum membaca dari pegangan file. Lihat Bagaimana saya bisa membaca seluruh file sekaligus? , atau
Lihat Variabel yang terkait dengan penanganan file di
perldoc perlvar
danperldoc -f local
.Kebetulan, jika Anda dapat meletakkan skrip Anda di server, Anda dapat memiliki semua modul yang Anda inginkan. Lihat Bagaimana cara menyimpan direktori modul / perpustakaan saya sendiri? .
Selain itu, Path :: Class :: File memungkinkan Anda untuk menyeruput dan memuntahkan .
Jalur :: kecil memberikan metode kenyamanan bahkan lebih seperti
slurp
,slurp_raw
,slurp_utf8
serta merekaspew
rekan-rekan.sumber
$/
, Anda mungkin harus menambahkan tautan untuk informasi lebih lanjut.local
dan tidakmy
.Saya akan melakukannya seperti ini:
Perhatikan penggunaan versi tiga argumen dari open. Ini jauh lebih aman daripada dua versi argumen lama (atau satu). Perhatikan juga penggunaan filehandle leksikal. Penanganan file leksikal lebih bagus daripada varian bareword lama, karena berbagai alasan. Kami memanfaatkan salah satunya di sini: mereka menutup saat berada di luar jangkauan.
sumber
Dengan File :: Slurp :
Ya, bahkan Anda bisa menggunakan CPAN .
sumber
Can't locate File/Slurp.pm in @INC (@INC contains: /usr/lib/perl5/5.8/msys
:(Semua postingan sedikit non-idiomatik. Idiomnya adalah:
Sebagian besar, tidak perlu menyetel $ / ke
undef
.sumber
local $foo = undef
hanyalah metode yang disarankan Perl Best Practice (PBP). Jika kita memposting potongan kode, saya pikir melakukan yang terbaik untuk menjelaskannya adalah Hal yang Baik.Dari perlfaq5: Bagaimana saya bisa membaca seluruh file sekaligus? :
Anda dapat menggunakan modul File :: Slurp untuk melakukannya dalam satu langkah.
Pendekatan Perl biasa untuk memproses semua baris dalam file adalah melakukannya satu baris dalam satu waktu:
Ini jauh lebih efisien daripada membaca seluruh file ke dalam memori sebagai deretan baris dan kemudian memprosesnya satu elemen pada satu waktu, yang seringkali - jika tidak hampir selalu - pendekatan yang salah. Kapanpun Anda melihat seseorang melakukan ini:
Anda harus berpikir panjang dan keras tentang mengapa Anda membutuhkan semuanya dimuat sekaligus. Ini bukan solusi yang terukur. Anda mungkin juga merasa lebih menyenangkan menggunakan modul Tie :: File standar, atau binding $ DB_RECNO modul DB_File, yang memungkinkan Anda mengikat array ke file sehingga mengakses elemen array benar-benar mengakses baris yang sesuai dalam file .
Anda dapat membaca seluruh konten penanganan file ke dalam skalar.
Itu sementara undefs pemisah catatan Anda, dan secara otomatis akan menutup file di blok keluar. Jika file sudah terbuka, gunakan saja ini:
Untuk file biasa Anda juga dapat menggunakan fungsi baca.
Argumen ketiga menguji ukuran byte data pada INPUT filehandle dan membaca banyak byte ke dalam buffer $ var.
sumber
Cara yang sederhana adalah:
Cara lain adalah dengan mengubah pemisah catatan masukan "$ /". Anda dapat melakukannya secara lokal dalam blok kosong untuk menghindari perubahan pemisah data global.
sumber
{local $/; open(my $f, '<', 'filename'); $d = <$f>;}
open
atau yang dipanggil secara implisitclose
.my $d = do{ local $/; open(my $f, '<', 'filename') or die $!; my $tmp = <$f>; close $f or die $!; $tmp}
. (Itu masih memiliki masalah karena tidak menentukan pengkodean input.)use autodie
, peningkatan besar yang ingin saya tunjukkan adalah filehandle leksikal dan 3 arg terbuka. Apakah ada alasan Anda melakukando
ini? mengapa tidak membuang file ke variabel yang dideklarasikan sebelum blok?Baik setel
$/
keundef
(lihat jawaban jrockway) atau cukup gabungkan semua baris file:Direkomendasikan untuk menggunakan skalar untuk penanganan file pada versi Perl yang mendukungnya.
sumber
Cara lain yang mungkin:
sumber
Anda hanya mendapatkan baris pertama dari operator berlian
<FILE>
karena Anda mengevaluasinya dalam konteks skalar:Dalam konteks daftar / larik, operator berlian akan mengembalikan semua baris file.
sumber
<=>
dan<>
operator intan.Saya akan melakukannya dengan cara yang paling sederhana, sehingga siapa pun dapat memahami apa yang terjadi, meskipun ada cara yang lebih cerdas:
sumber
<f>
- mengembalikan array baris dari file kita (jika$/
memiliki nilai default"\n"
) dan kemudianjoin ''
akan menempelkan array ini ke.sumber
Ini lebih merupakan saran tentang bagaimana TIDAK melakukannya. Saya baru saja mengalami kesulitan menemukan bug di aplikasi Perl yang agak besar. Sebagian besar modul memiliki file konfigurasinya sendiri. Untuk membaca file konfigurasi secara keseluruhan, saya menemukan satu baris Perl ini di suatu tempat di Internet:
Ini menetapkan kembali pemisah garis seperti yang dijelaskan sebelumnya. Tetapi itu juga menetapkan ulang STDIN.
Ini memiliki setidaknya satu efek samping yang menghabiskan waktu berjam-jam untuk menemukannya: Ini tidak menutup pegangan file implisit dengan benar (karena tidak memanggil
close
sama sekali).Misalnya, melakukan itu:
menghasilkan:
Hal yang aneh adalah, bahwa penghitung baris
$.
meningkat untuk setiap file satu per satu. Ini tidak diatur ulang, dan tidak berisi jumlah baris. Dan itu tidak diatur ulang ke nol saat membuka file lain sampai setidaknya satu baris dibaca. Dalam kasus saya, saya melakukan sesuatu seperti ini:Karena masalah ini, kondisinya salah karena penghitung saluran tidak diatur ulang dengan benar. Saya tidak tahu apakah ini bug atau kode yang salah ... Panggilan
close;
oderclose STDIN;
juga tidak membantu.Saya mengganti kode yang tidak dapat dibaca ini dengan menggunakan open, string concatenation, dan close. Namun, solusi yang diposting oleh Brad Gilbert juga berfungsi karena menggunakan pegangan file eksplisit sebagai gantinya.
Tiga baris di awal dapat diganti dengan:
yang dengan benar menutup pegangan file.
sumber
Menggunakan
sebelumnya
$document = <FILE>;
.$/
adalah pemisah rekaman input , yang merupakan baris baru secara default. Dengan mendefinisikan ulang menjadiundef
, Anda mengatakan tidak ada pemisah bidang. Ini disebut mode "slurp".Solusi lain seperti
undef $/
danlocal $/
(tetapi tidakmy $/
) mendeklarasikan ulang $ / dan dengan demikian menghasilkan efek yang sama.sumber
Anda cukup membuat sub-rutin:
sumber
Saya tidak tahu apakah ini latihan yang baik, tetapi saya biasa menggunakan ini:
sumber
Ini semua adalah jawaban yang bagus. TETAPI jika Anda merasa malas, dan file tidak sebesar itu, dan keamanan bukanlah masalah (Anda tahu Anda tidak memiliki nama file yang tercemar), maka Anda dapat keluar:
sumber
Anda dapat menggunakan cat di Linux:
sumber