perlopentut - Online in the Cloud

Ini ialah arahan perlopentut yang boleh dijalankan dalam penyedia pengehosan percuma OnWorks menggunakan salah satu daripada berbilang stesen kerja dalam talian percuma kami seperti Ubuntu Online, Fedora Online, emulator dalam talian Windows atau emulator dalam talian MAC OS.

JADUAL:

NAMA


perlopentut - resipi mudah untuk membuka fail dan paip dalam Perl

DESCRIPTION


Setiap kali anda melakukan I/O pada fail dalam Perl, anda melakukannya melalui apa yang dalam Perl dipanggil a
pemegang fail. Filehandle ialah nama dalaman untuk fail luaran. Ia adalah tugas
fungsi "terbuka" untuk membuat perkaitan antara nama dalaman dan nama luaran,
dan ia adalah tugas fungsi "tutup" untuk memecahkan persatuan itu.

Untuk kemudahan anda, Perl menyediakan beberapa pemegang fail khas yang sudah dibuka apabila
awak lari. Ini termasuk "STDIN", "STDOUT", "STDERR" dan "ARGV". Oleh kerana itu adalah pra-
dibuka, anda boleh menggunakannya serta-merta tanpa perlu bersusah payah membukanya
diri anda:

cetak STDERR "Ini ialah mesej nyahpepijat.\n";

print STDOUT "Sila masukkan sesuatu: ";
$respon = // mati "kenapa tiada input?";
cetak STDOUT "Terima kasih!\n";

sementara ( ) { ... }

Seperti yang anda lihat daripada contoh tersebut, "STDOUT" dan "STDERR" ialah pemegang output dan "STDIN" dan
"ARGV" ialah pemegang input. Mereka dalam semua huruf besar kerana mereka dikhaskan untuk
Perl, sama seperti tatasusunan @ARGV dan cincangan %ENV. Persatuan luar mereka ialah
disediakan oleh cangkerang anda.

Anda perlu membuka setiap pemegang fail lain sendiri. Walaupun terdapat banyak
varian, cara paling biasa untuk memanggil Perl buka() fungsi adalah dengan tiga hujah dan
satu nilai pulangan:

" OK = buka (PENANGAN, MOD, PATHNAME)"

Di mana:

OK akan menjadi beberapa nilai yang ditentukan jika buka berjaya, tetapi "undef" jika ia gagal;

MENGENDALIKAN
mestilah pembolehubah skalar yang tidak ditentukan untuk diisi oleh fungsi "terbuka" jika ia
berjaya;

MODE
ialah mod akses dan format pengekodan untuk membuka fail dengan;

PATHNAME
ialah nama luaran fail yang anda mahu buka.

Kebanyakan kerumitan fungsi "terbuka" terletak pada banyak kemungkinan nilai yang
MODE parameter boleh mengambil.

Satu perkara terakhir sebelum kami menunjukkan kepada anda cara membuka fail: membuka fail tidak (biasanya)
menguncinya secara automatik dalam Perl. Lihat perlfaq5 untuk cara mengunci.

Pembukaan teks Fail


Pembukaan teks Fail Untuk Reading
Jika anda ingin membaca daripada fail teks, mula-mula bukanya dalam mod baca sahaja seperti ini:

$nama fail saya = "/some/path/to/a/textfile/goes/here";
my $encoding = ":encoding(UTF-8)";
$handle saya = undef; # ini akan diisi pada kejayaan

open($handle, "< $encoding", $filename)
|| mati "$0: tidak boleh membuka $filename untuk membaca: $!";

Seperti shell, dalam Perl "<" digunakan untuk membuka fail dalam mod baca sahaja. Jika ia
berjaya, Perl memperuntukkan pemegang fail baharu untuk anda dan mengisi fail anda sebelum ini
hujah $handle undefined dengan rujukan kepada pemegang itu.

Kini anda boleh menggunakan fungsi seperti "readline", "read", "getc", dan "sysread" pada pemegang itu.
Mungkin fungsi input yang paling biasa ialah fungsi yang kelihatan seperti pengendali:

$line = readline($handle);
$line = <$handle>; # benda yang sama

Kerana fungsi "readline" mengembalikan "undef" pada akhir fail atau apabila ralat, anda akan melakukannya
kadang-kadang lihat ia digunakan dengan cara ini:

$line = <$handle>;
jika (ditakrifkan $line) {
# lakukan sesuatu dengan $line
}
lain {
# $line tidak sah, jadi langkau
}

Anda juga boleh "mati" dengan cepat pada nilai yang tidak ditentukan dengan cara ini:

$line = <$handle> // mati "tiada input ditemui";

Walau bagaimanapun, jika memukul EOF adalah peristiwa yang dijangka dan biasa, anda tidak mahu keluar begitu sahaja
kerana anda telah kehabisan input. Sebaliknya, anda mungkin hanya mahu keluar dari gelung input.
Anda kemudiannya boleh menguji untuk melihat sama ada ralat sebenar telah menyebabkan gelung ditamatkan dan bertindak
dengan sewajarnya:

manakala (<$handle>) {
# lakukan sesuatu dengan data dalam $_
}
jika ($!) {
mati "ralat yang tidak dijangka semasa membaca dari $filename: $!";
}

A Nota on Pengekodan: Keperluan untuk menentukan pengekodan teks setiap masa mungkin kelihatan agak a
menyusahkan. Untuk menyediakan pengekodan lalai untuk "terbuka" supaya anda tidak perlu membekalkannya setiap satu
masa, anda boleh menggunakan pragma "terbuka":

gunakan open qw< :encoding(UTF-8) >;

Setelah anda melakukannya, anda boleh meninggalkan bahagian pengekodan mod terbuka dengan selamat:

open($handle, "<", $filename)
|| mati "$0: tidak boleh membuka $filename untuk membaca: $!";

Tetapi jangan sekali-kali menggunakan "<" kosong tanpa menyediakan pengekodan lalai terlebih dahulu. Jika tidak,
Perl tidak dapat mengetahui yang mana antara banyak, banyak, banyak kemungkinan perisa fail teks yang anda miliki, dan
Perl tidak akan tahu cara memetakan data dalam fail anda dengan betul kepada aksara sebenar
ia boleh berfungsi dengan. Format pengekodan biasa lain termasuk "ASCII", "ISO-8859-1",
"ISO-8859-15", "Windows-1252", "MacRoman", dan juga "UTF-16LE". Lihat perlunitut untuk lebih lanjut
tentang pengekodan.

Pembukaan teks Fail Untuk Penulisan
Apabila anda ingin menulis pada fail, anda perlu memutuskan perkara yang perlu dilakukan terlebih dahulu mengenai mana-mana yang sedia ada
kandungan fail itu. Anda mempunyai dua pilihan asas di sini: untuk memelihara atau untuk memusnahkan.

Jika anda ingin mengekalkan sebarang kandungan sedia ada, maka anda ingin membuka fail dalam lampiran
mod. Seperti dalam shell, dalam Perl anda menggunakan ">>" untuk membuka fail sedia ada dalam mod tambah.
">>" mencipta fail jika ia belum wujud.

$handle saya = undef;
$nama fail saya = "/some/path/to/a/textfile/goes/here";
my $encoding = ":encoding(UTF-8)";

open($handle, ">> $encoding", $filename)
|| mati "$0: tidak boleh membuka $filename untuk menambahkan: $!";

Kini anda boleh menulis ke pemegang fail itu menggunakan mana-mana "cetak", "printf", "katakan", "tulis", atau
"syswrite".

Seperti yang dinyatakan di atas, jika fail itu belum wujud, maka mod tambahan terbuka akan dibuat
ia untuk anda. Tetapi jika fail itu sudah wujud, kandungannya selamat daripada bahaya kerana
anda akan menambah teks baharu anda melepasi penghujung teks lama.

Sebaliknya, kadang-kadang anda ingin memusnahkan apa sahaja yang mungkin sudah ada. Kepada
mengosongkan fail sebelum anda mula menulis kepadanya, anda boleh membukanya dalam mod tulis sahaja:

$handle saya = undef;
$nama fail saya = "/some/path/to/a/textfile/goes/here";
my $encoding = ":encoding(UTF-8)";

open($handle, "> $encoding", $filename)
|| mati "$0: tidak boleh membuka $nama fail dalam mod buka-tulis: $!";

Di sini sekali lagi Perl berfungsi sama seperti cangkerang kerana ">" menutup fail sedia ada.

Seperti mod tambah, apabila anda membuka fail dalam mod tulis sahaja, anda kini boleh menulis ke
pemegang fail itu menggunakan mana-mana "print", "printf", "say", "write", atau "syswrite".

Bagaimana pula dengan mod baca-tulis? Anda mungkin harus berpura-pura ia tidak wujud, kerana membuka
fail teks dalam mod baca-tulis tidak mungkin melakukan perkara yang anda mahu. Lihat perlfaq5 untuk
butiran.

Pembukaan Perduaan Fail


Jika fail yang akan dibuka mengandungi data binari dan bukannya aksara teks, maka "MODE"
hujah untuk "membuka" adalah sedikit berbeza. Daripada menentukan pengekodan, anda memberitahu
Perl bahawa data anda berada dalam bait mentah.

$nama fail saya = "/some/path/to/a/binary/file/goes/here";
my $encoding = ":raw :bytes"
$handle saya = undef; # ini akan diisi pada kejayaan

Dan kemudian buka seperti sebelumnya, pilih "<", ">>", atau ">" seperti yang diperlukan:

open($handle, "< $encoding", $filename)
|| mati "$0: tidak boleh membuka $filename untuk membaca: $!";

open($handle, ">> $encoding", $filename)
|| mati "$0: tidak boleh membuka $filename untuk menambahkan: $!";

open($handle, "> $encoding", $filename)
|| mati "$0: tidak boleh membuka $nama fail dalam mod buka-tulis: $!";

Secara bergantian, anda boleh menukar kepada mod binari pada pemegang sedia ada dengan cara ini:

binmode($handle) || mati "tidak boleh mengendalikan mod bin";

Ini amat berguna untuk pemegang yang telah dibuka oleh Perl untuk anda.

binmode(STDIN) || mati "tidak boleh binmode STDIN";
binmode(STDOUT) || mati "tidak boleh binmode STDOUT";

Anda juga boleh menghantar "binmode" pengekodan eksplisit untuk menukarnya dengan cepat. Ini bukan
betul-betul mod "binari", tetapi kami masih menggunakan "binmode" untuk melakukannya:

binmode(STDIN, ":encoding(MacRoman)") || mati "tidak boleh binmode STDIN";
binmode(STDOUT, ":encoding(UTF-8)") || mati "tidak boleh binmode STDOUT";

Sebaik sahaja anda mempunyai fail binari anda dibuka dengan betul dalam mod yang betul, anda boleh menggunakan semua yang sama
Perl I/O berfungsi seperti yang anda gunakan pada fail teks. Walau bagaimanapun, anda mungkin ingin menggunakan saiz tetap
"baca" dan bukannya "garis baca" bersaiz pembolehubah untuk input anda.

Berikut ialah contoh cara menyalin fail binari:

$BUFSIZ saya = 64 * (2 ** 10);
my $name_in = "/some/input/file";
$name_out saya = "/some/output/flie";

my($in_fh, $out_fh, $buffer);

buka($in_fh, "<", $name_in)
|| mati "$0: tidak boleh membuka $name_in untuk bacaan: $!";
buka($out_fh, ">", $name_out)
|| mati "$0: tidak boleh membuka $name_out untuk menulis: $!";

untuk $fh saya ($in_fh, $out_fh) {
binmode($fh) || mati "mod bin gagal";
}

manakala (baca($in_fh, $buffer, $BUFSIZ)) {
melainkan (cetak $out_fh $buffer) {
mati "tidak dapat menulis kepada $name_out: $!";
}
}

tutup($in_fh) || mati "tidak dapat menutup $name_in: $!";
tutup($out_fh) || mati "tidak dapat menutup $name_out: $!";

Pembukaan Paip


Yang akan diumumkan.

Level rendah File Buka melalui sysopen


Yang akan diumumkan. Atau dipadamkan.

Gunakan perlopentut dalam talian menggunakan perkhidmatan onworks.net



Program dalam talian Linux & Windows terkini