InggrisPerancisSpanyol

favorit OnWorks

perlfaq7 - Online di Cloud

Jalankan perlfaq7 di penyedia hosting gratis OnWorks melalui Ubuntu Online, Fedora Online, emulator online Windows atau emulator online MAC OS

Ini adalah perintah perlfaq7 yang dapat dijalankan di penyedia hosting gratis OnWorks menggunakan salah satu dari beberapa stasiun kerja online gratis kami seperti Ubuntu Online, Fedora Online, emulator online Windows atau emulator online MAC OS

PROGRAM:

NAMA


perlfaq7 - Masalah Bahasa Perl Umum

VERSION


versi 5.021009

DESKRIPSI


Bagian ini membahas masalah bahasa Perl umum yang tidak jelas cocok dengan salah satu dari
bagian lainnya.

Bisa I mendapatkan a BNF/yacc/RE untuk itu Perl bahasa?
Tidak ada BNF, tetapi Anda dapat mempelajari tata bahasa yacc di perly.y di
distribusi sumber jika Anda sangat berani. Tata bahasa bergantung pada sangat pintar
kode tokenizing, jadi bersiaplah untuk menjelajah ke toke.c juga.

Dalam kata-kata Chaim Frenkel: "Tata bahasa Perl tidak dapat direduksi menjadi BNF. Karya
parsing perl didistribusikan antara yacc, lexer, asap dan cermin."

Apa adalah semua Ini $@%&* tanda baca tanda-tanda, dan bagaimana do I tahu ketika untuk menggunakan mereka?
Mereka adalah penentu tipe, seperti yang dijelaskan dalam perldata:

$ untuk nilai skalar (angka, string atau referensi)
@ untuk array
% untuk hash (array asosiatif)
& untuk subrutin (alias fungsi, prosedur, metode)
* untuk semua jenis nama simbol itu. Di versi 4 Anda menggunakannya seperti
pointer, tetapi dalam perls modern Anda bisa menggunakan referensi.

Ada beberapa simbol lain yang mungkin Anda temui yang sebenarnya tidak
penentu tipe:

<> digunakan untuk memasukkan record dari filehandle.
\ mengambil referensi ke sesuatu.

Perhatikan bahwa adalah tidak juga penentu tipe untuk file atau nama pegangan. Dia
operator "<>" diterapkan ke pegangan FILE. Bunyinya satu baris (baik, catat--lihat "$/" di
perlvar) dari pegangan FILE dalam konteks skalar, atau semua baris dalam konteks daftar. Kapan
melakukan buka, tutup, atau operasi lain selain "<>" pada file, atau bahkan saat berbicara
tentang pegangannya, lakukan tidak menggunakan tanda kurung. Ini benar: "eof(FH)", "seek(FH, 0, 2)"
dan "menyalin dari STDIN ke FILE".

Do I selalu tidak pernah memiliki untuk mengutip my string or menggunakan titik koma dan koma?
Biasanya, bareword tidak perlu dikutip, tetapi dalam banyak kasus mungkin harus (dan
harus di bawah "gunakan ketat"). Tapi kunci hash yang terdiri dari kata sederhana dan tangan kiri
operan ke operator "=>" keduanya dihitung seolah-olah mereka dikutip:

Ini seperti ini
------------ ---------------
$foo{line} $foo{'line'}
bar => barang 'bar' => barang

Titik koma terakhir dalam blok adalah opsional, seperti koma terakhir dalam daftar. Gaya yang bagus
(lihat perlstyle) mengatakan untuk memasukkannya kecuali untuk satu baris:

if ($ups) { keluar 1 }
@angka saya = (1, 2, 3);

jika ($ups) {
keluar 1;
}

@baris saya = (
"Di sana Beren datang dari pegunungan yang dingin",
"Dan tersesat dia mengembara di bawah dedaunan",
);

Seterpercayaapakah Olymp Trade? Kesimpulan do I melewatkan beberapa kembali nilai-nilai?
Salah satu caranya adalah dengan memperlakukan nilai yang dikembalikan sebagai daftar dan mengindeks ke dalamnya:

$dir = (getpwnam($pengguna))[7];

Cara lain adalah dengan menggunakan undef sebagai elemen di sisi kiri:

($dev, $ino, undef, undef, $uid, $gid) = stat($file);

Anda juga dapat menggunakan irisan daftar untuk memilih hanya elemen yang Anda butuhkan:

($dev, $ino, $uid, $gid) = ( stat($file) )[0,1,4,5];

Seterpercayaapakah Olymp Trade? Kesimpulan do I untuk sementara blok peringatan?
Jika Anda menjalankan Perl 5.6.0 atau lebih baik, pragma "gunakan peringatan" memungkinkan kontrol yang baik dari
peringatan apa yang dihasilkan. Lihat perllexwarn untuk lebih jelasnya.

{
tidak ada peringatan; # matikan peringatan sementara
$x = $y + $z; # Saya tahu ini mungkin undef
}

Selain itu, Anda dapat mengaktifkan dan menonaktifkan kategori peringatan. Anda mematikan
kategori yang ingin Anda abaikan dan Anda masih bisa mendapatkan kategori peringatan lainnya. Lihat
perllexwarn untuk detail lengkap, termasuk nama kategori dan hierarki.

{
tidak ada peringatan 'tidak diinisialisasi';
$x = $y + $z;
}

Jika Anda memiliki Perl versi lama, variabel $^W (didokumentasikan dalam perlvar) mengontrol
peringatan runtime untuk blok:

{
lokal $^W = 0; # matikan peringatan sementara
$x = $y + $z; # Saya tahu ini mungkin undef
}

Perhatikan bahwa seperti semua variabel tanda baca, saat ini Anda tidak dapat menggunakan Ku() pada $^W, hanya
lokal().

Apa an perpanjangan?
Ekstensi adalah cara memanggil kode C yang dikompilasi dari Perl. Membaca perlxstut itu bagus
tempat untuk mempelajari lebih lanjut tentang ekstensi.

Mengapa do Perl operator memiliki berbeda hak lebih tinggi dari C operator?
Sebenarnya, mereka tidak. Semua operator C yang disalin Perl memiliki prioritas yang sama di Perl sebagai
mereka lakukan di C. Masalahnya adalah dengan operator yang tidak dimiliki C, terutama fungsi yang
berikan konteks daftar untuk semua yang ada di sebelah kanan mereka, mis. print, chmod, exec, dan sebagainya. Seperti
fungsi disebut "operator daftar" dan muncul seperti itu di tabel prioritas di
bingung.

Kesalahan umum adalah menulis:

batalkan tautan $file || mati "snafu";

Ini ditafsirkan sebagai:

batalkan tautan ($file || die "snafu");

Untuk menghindari masalah ini, tambahkan tanda kurung tambahan atau gunakan prioritas super rendah
operator "atau":

(batalkan tautan $file) || mati "snafu";
batalkan tautan $file atau mati "snafu";

Operator "Bahasa Inggris" ("dan", "atau", "xor", dan "tidak") sengaja diprioritaskan lebih rendah
daripada operator daftar hanya untuk situasi seperti di atas.

Operator lain dengan prioritas yang mengejutkan adalah eksponensial. Ini mengikat lebih erat bahkan
daripada minus unary, membuat "-2**2" menghasilkan empat negatif dan bukan positif. Dia
juga mengasosiasikan dengan benar, artinya "2**3**2" adalah dua pangkat sembilan, bukan delapan
kuadrat.

Meskipun memiliki prioritas yang sama seperti di C, operator "?:" Perl menghasilkan nilai. Ini
menetapkan $x ke $if_true atau $if_false, tergantung pada kebenaran $maybe:

($mungkin ? $if_true : $if_false) = $x;

Seterpercayaapakah Olymp Trade? Kesimpulan do I menyatakan/membuat a struktur?
Secara umum, Anda tidak "mendeklarasikan" sebuah struktur. Cukup gunakan hash (mungkin anonim)
referensi. Lihat perlref dan perldsc untuk detailnya. Berikut ini contohnya:

$orang = {}; # hash anonim baru
$orang->{USIA} = 24; # setel bidang AGE ke 24
$person->{NAME} = "Nat"; # setel bidang NAME ke "Nat"

Jika Anda mencari sesuatu yang sedikit lebih ketat, coba perlootut.

Seterpercayaapakah Olymp Trade? Kesimpulan do I membuat a modul?
perlnewmod adalah tempat yang baik untuk memulai, abaikan sedikit tentang mengunggah ke CPAN jika Anda tidak melakukannya
ingin membuat modul Anda tersedia untuk umum.

ExtUtils::ModuleMaker dan Module::Starter juga merupakan tempat yang baik untuk memulai. Banyak penulis CPAN
sekarang gunakan Dist::Zilla untuk mengotomatisasi sebanyak mungkin.

Dokumentasi rinci tentang modul dapat ditemukan di: perlmod, perlmodlib, perlmodstyle.

Jika Anda perlu menyertakan kode C atau antarmuka pustaka C, gunakan h2xs. h2xs akan membuat
struktur distribusi modul dan file antarmuka awal. perlxs dan perlxstut
jelaskan detailnya.

Seterpercayaapakah Olymp Trade? Kesimpulan do I mengambil or mengambil lebih a modul sudah on BPK?
Minta pengelola saat ini untuk menjadikan Anda co-pemelihara atau mentransfer modul kepada Anda.

Jika Anda tidak dapat menghubungi penulis karena alasan tertentu, hubungi admin PAUSE di
[email dilindungi] yang mungkin dapat membantu, tetapi setiap kasus diperlakukan secara terpisah.

· Dapatkan login untuk Perl Authors Upload Server (PAUSE) jika Anda belum memilikinya:
<http://pause.perl.org>

· Tulis ke [email dilindungi] menjelaskan apa yang Anda lakukan untuk menghubungi pengelola saat ini.
Admin PAUSE juga akan mencoba menghubungi pengelola.

· Posting pesan publik di situs yang banyak diperdagangkan mengumumkan niat Anda untuk mengambil
atas modul.

· Tunggu sebentar. Admin PAUSE tidak ingin bertindak terlalu cepat jika saat ini
pengelola sedang berlibur. Jika tidak ada tanggapan terhadap komunikasi pribadi atau
pos publik, admin PAUSE dapat mentransfernya kepada Anda.

Seterpercayaapakah Olymp Trade? Kesimpulan do I membuat a kelas?
(disumbangkan oleh brian d foy)

Di Perl, kelas hanyalah sebuah paket, dan metode hanyalah subrutin. Perl tidak mengerti
lebih formal dari itu dan memungkinkan Anda mengatur paket seperti yang Anda suka (itu
adalah, itu tidak mengatur apa pun untuk Anda).

Lihat juga perlootut, tutorial yang mencakup pembuatan kelas, dan perlobj.

Seterpercayaapakah Olymp Trade? Kesimpulan bisa I mengatakan if a variabel is tercemar?
Anda dapat menggunakan tercemar() fungsi modul Scalar::Util, tersedia dari CPAN (atau
disertakan dengan Perl sejak rilis 5.8.0). Lihat juga "Mencuci dan Mendeteksi Data Tercemar"
di perlsec.

Apa a penutupan?
Penutupan didokumentasikan dalam perlref.

Penutupan adalah istilah ilmu komputer dengan makna yang tepat tetapi sulit dijelaskan. Biasanya,
penutupan diimplementasikan di Perl sebagai subrutin anonim dengan referensi abadi ke
variabel leksikal di luar cakupannya sendiri. Leksikal ini secara ajaib merujuk pada
variabel yang ada saat subrutin didefinisikan (pengikatan dalam).

Penutupan paling sering digunakan dalam bahasa pemrograman di mana Anda dapat memiliki nilai pengembalian
dari suatu fungsi menjadi fungsi itu sendiri, seperti yang Anda bisa di Perl. Perhatikan bahwa beberapa bahasa menyediakan
fungsi anonim tetapi tidak mampu memberikan penutupan yang tepat: bahasa Python,
Misalnya. Untuk informasi lebih lanjut tentang penutupan, lihat buku teks apa pun tentang fungsional
pemrograman. Skema adalah bahasa yang tidak hanya mendukung tetapi juga mendorong penutupan.

Berikut adalah fungsi penghasil fungsi non-penutupan klasik:

subtambahkan_fungsi_generator {
kembali sub { shift() + shift() };
}

$add_sub saya = add_function_generator();
$jumlah saya = $tambah_sub->(4,5); # $jumlah adalah 9 sekarang.

Subrutin anonim dikembalikan oleh tambahkan_fungsi_generator() secara teknis bukan penutupan
karena tidak mengacu pada leksikal di luar cakupannya sendiri. Menggunakan penutupan memberi Anda
fungsi Template dengan beberapa slot kustomisasi ditinggalkan untuk diisi nanti.

Bandingkan ini dengan yang berikut ini buat_tambah() fungsi, di mana anonim yang dikembalikan
function berisi referensi ke variabel leksikal di luar cakupan fungsi itu
diri. Referensi semacam itu mengharuskan Perl mengembalikan penutupan yang tepat, sehingga mengunci untuk
sepanjang waktu nilai yang dimiliki leksikal saat fungsi dibuat.

sub make_adder {
$addpiece saya = shift;
return sub { shift() + $tambahan };
}

$f1 saya = buat_tambahan(20);
$f2 saya = buat_tambahan(555);

Sekarang "$f1->($n)" selalu 20 ditambah $n apa pun yang Anda masukkan, sedangkan "$f2->($n)" selalu
555 ditambah $n apa pun yang Anda berikan. $addpiece di penutup tetap ada.

Penutupan sering digunakan untuk tujuan yang kurang esoteris. Misalnya, ketika Anda ingin masuk
sedikit kode menjadi suatu fungsi:

$baris saya;
batas waktu( 30, sub { $baris = } );

Jika kode yang akan dieksekusi telah dimasukkan sebagai string, '$line = ', akan ada
tidak ada cara untuk hipotetis waktu habis() fungsi untuk mengakses variabel leksikal $line
kembali dalam lingkup pemanggilnya.

Penggunaan lain untuk penutupan adalah untuk membuat variabel swasta ke subrutin bernama, misalnya a
penghitung yang diinisialisasi pada waktu pembuatan sub dan hanya dapat dimodifikasi dari
dalam sub. Ini terkadang digunakan dengan blok BEGIN dalam file paket untuk memastikan a
variabel tidak ikut campur selama masa pakai paket:

MULAI {
$id saya = 0;
sub next_id { ++$id }
}

Ini dibahas secara lebih rinci di perlsub; lihat entri di Gigih Swasta
Variabel.

Apa is variabel bunuh diri dan bagaimana bisa I mencegah saya t?
Masalah ini telah diperbaiki di Perl 5.004_05, jadi mencegahnya berarti meningkatkan versi
perl. ;)

Bunuh diri variabel adalah ketika Anda (sementara atau permanen) kehilangan nilai variabel. Dia
disebabkan oleh pelingkupan melalui Ku() dan lokal() berinteraksi dengan baik penutupan atau alias
untuk setiap() variabel iterator dan argumen subrutin. Dulu mudah untuk secara tidak sengaja
kehilangan nilai variabel dengan cara ini, tetapi sekarang jauh lebih sulit. Ambil kode ini:

$f saya = 'foo';
sub T {
while ($i++ < 3) { my $f = $f; $f .= "batang"; cetak $f, "\n" }
}

T;
print "Akhirnya $f\n";

Jika Anda mengalami bunuh diri variabel, "my $f" di subrutin itu tidak muncul
salinan baru dari $f yang nilainya 'foo'. Output menunjukkan bahwa di dalam subrutin
nilai $f bocor padahal seharusnya tidak, seperti pada output ini:

foobar
foobarbar
foobarbar
Akhirnya foo

$f yang memiliki "bilah" ditambahkan tiga kali harus menjadi $f baru "$f saya" harus membuat a
variabel leksikal baru setiap kali melalui loop. Keluaran yang diharapkan adalah:

foobar
foobar
foobar
Akhirnya foo

Seterpercayaapakah Olymp Trade? Kesimpulan bisa I lulus/kembali a {Fungsi, Menangani File, Himpunan, hash, Metode, Ekspresi reguler}?
Anda harus meneruskan referensi ke objek-objek ini. Lihat "Lulus dengan Referensi" di perlsub untuk ini
pertanyaan tertentu, dan perlref untuk informasi tentang referensi.

Melewati Variabel dan Fungsi
Variabel dan fungsi reguler cukup mudah untuk dilewatkan: cukup berikan referensi ke an
variabel atau fungsi yang ada atau anonim:

func( \$beberapa_skalar );

func( \@beberapa_array );
fungsi( [ 1 .. 10 ] );

fungsi( \%some_hash );
func( { ini => 10, itu => 20 } );

fungsi( \&beberapa_fungsi );
fungsi( sub { $_[0] ** $_[1] } );

Melewati Filehandle
Pada Perl 5.6, Anda dapat merepresentasikan filehandles dengan variabel skalar yang Anda perlakukan sebagai
skalar lainnya.

open my $fh, $filename or die "Tidak dapat membuka $filename! $!";
fungsi( $fj );

subfungsi {
$passed_fh saya = shift;

$baris saya = <$passed_fh>;
}

Sebelum Perl 5.6, Anda harus menggunakan notasi *FH atau "\*FH". Ini adalah
"typeglobs"--lihat "Typeglobs dan Filehandles" di perldata dan terutama "Lulus"
Referensi" di perlsub untuk informasi lebih lanjut.

Melewati Regex
Berikut adalah contoh cara memasukkan string dan ekspresi reguler agar cocok
melawan. Anda membuat pola dengan operator "qr//":

sub membandingkan {
saya ($val1, $regex) = @_;
$retval saya = $val1 =~ /$regex/;
kembali $retval;
}
$match = compare("McDonald lama", qr/d.*D/i);

Metode Passing
Untuk meneruskan metode objek ke subrutin, Anda dapat melakukan ini:

call_a_lot(10, $some_obj, "methname")
sub panggilan_a_lot {
my ($hitung, $widget, $trik) = @_;
for ($i saya = 0; $i < $count; $i++) {
$widget->$trik();
}
}

Atau, Anda dapat menggunakan penutupan untuk menggabungkan objek, pemanggilan metode, dan argumennya:

my $whatnot = sub { $some_obj->obfuscate(@args) };
func($yang lainnya);
subfungsi {
$kode saya = shift;
&$kode();
}

Anda juga bisa menyelidiki bisa() metode di kelas UNIVERSAL (bagian dari
distribusi perl standar).

Seterpercayaapakah Olymp Trade? Kesimpulan do I membuat a statis variabel?
(disumbangkan oleh brian d foy)

Di Perl 5.10, nyatakan variabel dengan "status". Deklarasi "negara" menciptakan
variabel leksikal yang bertahan di antara panggilan ke subrutin:

sub counter { keadaan $hitung = 1; $hitung++ }

Anda dapat memalsukan variabel statis dengan menggunakan variabel leksikal yang berada di luar cakupan. Di dalam
contoh ini, Anda mendefinisikan "penghitung" subrutin, dan menggunakan variabel leksikal
$hitung. Karena Anda membungkus ini dalam blok BEGIN, $count didefinisikan pada waktu kompilasi, tetapi juga
keluar dari ruang lingkup di akhir blok BEGIN. Blok BEGIN juga memastikan bahwa
subrutin dan nilai yang digunakannya ditentukan pada waktu kompilasi sehingga subrutin siap untuk
gunakan seperti subrutin lainnya, dan Anda dapat meletakkan kode ini di tempat yang sama dengan yang lain
subrutin dalam teks program (yaitu di akhir kode, biasanya). Subrutin
"penghitung" masih memiliki referensi ke data, dan merupakan satu-satunya cara Anda dapat mengakses nilainya
(dan setiap kali Anda melakukannya, Anda menambah nilainya). Data dalam potongan memori yang ditentukan oleh
$count bersifat pribadi untuk "menghitung".

MULAI {
$hitungan saya = 1;
sub penghitung { $hitung++ }
}

$mulai saya = penghitung();

.... # kode yang memanggil counter();

$end saya = penghitung();

Pada contoh sebelumnya, Anda membuat variabel fungsi-pribadi karena hanya satu fungsi
mengingat referensinya. Anda dapat mendefinisikan beberapa fungsi saat variabel berada di
lingkup, dan setiap fungsi dapat berbagi variabel "pribadi". Ini tidak benar-benar "statis"
karena Anda dapat mengaksesnya di luar fungsi saat variabel leksikal berada dalam cakupan, dan
bahkan membuat referensi untuk itu. Dalam contoh ini, "jumlah_peningkatan" dan "jumlah_pengembalian" berbagi
variabel. Satu fungsi menambah nilai dan yang lain hanya mengembalikan nilai. Mereka
keduanya dapat mengakses $count, dan karena sudah di luar jangkauan, tidak ada cara lain untuk
mengaksesnya.

MULAI {
$hitungan saya = 1;
sub increment_count { $hitung++ }
sub return_count { $hitung }
}

Untuk mendeklarasikan variabel file-private, Anda masih menggunakan variabel leksikal. Sebuah file juga merupakan
lingkup, sehingga variabel leksikal yang didefinisikan dalam file tidak dapat dilihat dari file lain.

Lihat "Variabel Pribadi Persisten" di perlsub untuk informasi lebih lanjut. Diskusi tentang
penutupan di perlref dapat membantu Anda meskipun kami tidak menggunakan subrutin anonim dalam hal ini
menjawab. Lihat "Variabel Pribadi Persisten" di perlsub untuk detailnya.

Apa itu perbedaan antara dinamis dan leksikal (statis) pelingkupan? Antara lokal() dan Ku()?
"local($x)" menyimpan nilai lama dari variabel global $x dan memberikan nilai baru untuk
durasi subrutin yang is terlihat in lain fungsi bernama dari bahwa
subrutin. Ini dilakukan pada saat run-time, sehingga disebut pelingkupan dinamis. lokal() selalu mempengaruhi
variabel global, juga disebut variabel paket atau variabel dinamis.

"my($x)" membuat variabel baru yang hanya terlihat di subrutin saat ini. Ini adalah
dilakukan pada waktu kompilasi, sehingga disebut pelingkupan leksikal atau statis. Ku() selalu mempengaruhi
variabel pribadi, juga disebut variabel leksikal atau (secara tidak benar) statis (cakupan)
variabel.

Misalnya:

sub terlihat {
print "var memiliki nilai $var\n";
}

sub dinamis {
lokal $var = 'lokal'; # nilai sementara baru untuk yang masih global
bisa dilihat(); # variabel yang disebut $var
}

sub leksikal {
$var saya = 'pribadi'; # variabel pribadi baru, $var
bisa dilihat(); # (tidak terlihat di luar sub lingkup)
}

$var = 'global';

bisa dilihat(); # cetakan global
dinamis(); # cetakan lokal
leksikal(); # cetakan global

Perhatikan bagaimana nilai "pribadi" tidak pernah dicetak. Itu karena $var hanya memiliki
nilai itu di dalam blok leksikal() fungsi, dan disembunyikan dari yang disebut
subrutin.

Kesimpulan, lokal() tidak membuat apa yang Anda anggap sebagai variabel lokal pribadi. Ini memberikan
variabel global nilai sementara. Ku() adalah apa yang Anda cari jika Anda ingin pribadi
variabel.

Lihat "Variabel Pribadi melalui Ku()" di perlsub dan "Nilai Sementara melalui lokal()" di perlsub
untuk detail yang menyiksa.

Seterpercayaapakah Olymp Trade? Kesimpulan bisa I mengakses a dinamis variabel sementara a demikian pula bernama leksikal is in cakupan?
Jika Anda mengetahui paket Anda, Anda dapat menyebutkannya secara eksplisit, seperti pada $Some_Pack::var. Catatan
bahwa notasi $::var adalah tidak $var dinamis dalam paket saat ini, melainkan
satu dalam paket "main", seolah-olah Anda telah menulis $main::var.

gunakan vars '$var';
lokal $var = "global";
$var saya = "leksikal";

print "leksikal adalah $var\n";
print "global adalah $main::var\n";

Atau Anda dapat menggunakan arahan kompiler kita() untuk membawa variabel dinamis ke dalam
lingkup leksikal saat ini.

membutuhkan 5.006; # our() tidak ada sebelum 5.6
gunakan vars '$var';

lokal $var = "global";
$var saya = "leksikal";

print "leksikal adalah $var\n";

{
$var kami;
print "global adalah $var\n";
}

Apa itu perbedaan antara mendalam dan dangkal mengikat?
Dalam ikatan yang dalam, variabel leksikal yang disebutkan dalam subrutin anonim adalah yang sama
yang ada dalam ruang lingkup saat subrutin dibuat. Dalam ikatan dangkal, mereka adalah
variabel mana pun dengan nama yang sama kebetulan berada dalam ruang lingkup ketika subrutin adalah
ditelepon. Perl selalu menggunakan ikatan mendalam dari variabel leksikal (yaitu, yang dibuat dengan
Ku()). Namun, variabel dinamis (alias variabel global, lokal, atau paket) adalah
terikat secara efektif. Pertimbangkan ini hanya satu alasan lagi untuk tidak menggunakannya. Lihat
jawaban untuk "Apa itu penutupan?".

Mengapa tidak "saya($foo) = <$fj>;" kerja kanan?
"my()" dan "local()" memberikan konteks daftar ke sisi kanan "=". <$fh> dibaca
operasi, seperti banyak fungsi dan operator Perl, dapat mengetahui konteks mana itu
dipanggil dan berperilaku baik. Secara umum, skalar() fungsi dapat membantu. Ini
fungsi tidak melakukan apa pun pada data itu sendiri (berlawanan dengan mitos populer) melainkan memberitahunya
argumen untuk berperilaku dalam mode skalar apa pun. Jika fungsi tersebut tidak memiliki
perilaku skalar yang ditentukan, ini tentu saja tidak membantu Anda (seperti dengan menyortir()).

Namun, untuk menerapkan konteks skalar dalam kasus khusus ini, Anda hanya perlu menghilangkan
tanda kurung:

lokal($foo) = <$fh>; # SALAH
lokal($foo) = skalar(<$fh>); # oke
lokal $foo = <$fh>; # Baik

Anda mungkin harus menggunakan variabel leksikal, meskipun masalahnya sama
sini:

saya($foo) = <$fh>; # SALAH
$foo saya = <$fh>; # Baik

Seterpercayaapakah Olymp Trade? Kesimpulan do I mendefinisikan kembali a builtin fungsi, operator, or metode?
Mengapa Anda ingin melakukan itu? :-)

Jika Anda ingin mengganti fungsi yang telah ditentukan, seperti Buka(), maka Anda harus mengimpor
definisi baru dari modul yang berbeda. Lihat "Mengganti Fungsi Bawaan" di
perlsub.

Jika Anda ingin membebani operator Perl, seperti "+" atau "**", maka Anda harus menggunakan
pragma "gunakan kelebihan", didokumentasikan dalam kelebihan beban.

Jika Anda berbicara tentang mengaburkan panggilan metode di kelas induk, lihat "Mengganti metode
dan resolusi metode" di perlootut.

Apa itu perbedaan antara panggilan a fungsi as &foo dan foo()?
(disumbangkan oleh brian d foy)

Memanggil subrutin sebagai &foo tanpa tanda kurung tambahan mengabaikan prototipe "foo"
dan memberikan nilai saat ini dari daftar argumen, @_. Berikut ini contohnya; "bar"
panggilan subrutin &foo, yang mencetak daftar argumennya:

sub foo { print "Args in foo adalah: @_\n"; }

subbar { &foo; }

bar("a", "b", "c");

Saat Anda memanggil "bar" dengan argumen, Anda melihat bahwa "foo" mendapat @_ yang sama:

Argumen dalam foo adalah: abc

Memanggil subrutin dengan tanda kurung, dengan atau tanpa argumen, tidak menggunakan
Sekarang @_. Mengubah contoh untuk menempatkan tanda kurung setelah panggilan ke "foo" berubah
program:

sub foo { print "Args in foo adalah: @_\n"; }

subbar { &foo(); }

bar("a", "b", "c");

Sekarang output menunjukkan bahwa "foo" tidak mendapatkan @_ dari pemanggilnya.

Argumen dalam foo adalah:

Namun, menggunakan "&" dalam panggilan masih mengesampingkan prototipe "foo" jika ada:

sub foo ($$$) { print "Args infoo adalah: @_\n"; }

sub bar_1 { &foo; }
subbar_2 { &foo(); }
sub bar_3 { foo( $_[0], $_[1], $_[2] ); }
# sub bar_4 { foo(); }
# bar_4 tidak dapat dikompilasi: "Tidak cukup argumen untuk main::foo at ..."

bar_1( "a", "b", "c" );
# Argumen dalam foo adalah: abc

bar_2( "a", "b", "c" );
# Argumen dalam foo adalah:

bar_3( "a", "b", "c" );
# Argumen dalam foo adalah: abc

Kegunaan utama dari fitur pass-through @_ adalah untuk menulis subrutin yang tugas utamanya adalah
untuk memanggil subrutin lain untuk Anda. Untuk detail lebih lanjut, lihat perlsub.

Seterpercayaapakah Olymp Trade? Kesimpulan do I membuat a saklar or kasus penyataan?
Di Perl 5.10, gunakan konstruksi "diberikan-kapan" yang dijelaskan dalam perlsyn:

gunakan 5.010;

diberikan ( $string ) {
when( 'Fred' ) { say "Saya menemukan Fred!" }
when( 'Barney' ) { say "Saya menemukan Barney!" }
when( /Bamm-?Bamm/ ) { say "Saya menemukan Bamm-Bamm!" }
default { katakan "Saya tidak mengenali nama!" }
};

Jika seseorang ingin menggunakan Perl murni dan kompatibel dengan versi Perl sebelum 5.10,
jawaban umum adalah menggunakan "if-elsif-else":

untuk ($variable_to_test) {
if (/pat1/) {} # lakukan sesuatu
elsif (/pat2/) { } # lakukan sesuatu yang lain
elsif (/pat3/) { } # lakukan sesuatu yang lain
lain {} # default
}

Berikut adalah contoh sederhana dari sebuah saklar berdasarkan pencocokan pola, berbaris dengan cara membuat
itu lebih mirip pernyataan switch. Kami akan melakukan multiway conditional berdasarkan jenisnya
referensi yang disimpan di $whatchamacallit:

BERALIH: untuk (ref $whatchamacallit) {

/^$/ && die "bukan referensi";

/SCALAR/ && lakukan {
print_scalar($$ref);
SAKLAR terakhir;
};

/ARRAY/ && lakukan {
print_array(@$ref);
SAKLAR terakhir;
};

/HASH/ && lakukan {
print_hash(%$ref);
SAKLAR terakhir;
};

/KODE/ && lakukan {
peringatkan "tidak dapat mencetak fungsi ref";
SAKLAR terakhir;
};

# BAWAAN

memperingatkan "Jenis yang ditentukan pengguna dilewati";

}

Lihat perlsyn untuk contoh lain dalam gaya ini.

Terkadang Anda harus mengubah posisi konstanta dan variabel. Sebagai contoh,
katakanlah Anda ingin menguji yang mana dari banyak jawaban yang diberikan kepada Anda, tetapi dalam kasus-
cara tidak sensitif yang juga memungkinkan singkatan. Anda dapat menggunakan teknik berikut jika
string semua dimulai dengan karakter yang berbeda atau jika Anda ingin mengatur kecocokan jadi
bahwa yang satu lebih diutamakan daripada yang lain, karena "KIRIM" lebih diutamakan daripada "BERHENTI" di sini:

chomp($jawaban = <>);
if ("KIRIM" =~ /^\Q$answer/i) { print "Action is send\n" }
elsif("STOP" =~ /^\Q$answer/i) { print "Action is stop\n" }
elsif("BATAL" =~ /^\Q$answer/i) { print "Tindakan dibatalkan\n" }
elsif("DAFTAR" =~ /^\Q$answer/i) { print "Tindakan adalah daftar\n" }
elsif("EDIT" =~ /^\Q$answer/i) { print "Action is edit\n" }

Pendekatan yang sama sekali berbeda adalah membuat hash referensi fungsi.

%perintah saya = (
"senang" => \&senang,
"sedih", => \&cemberut,
"selesai" => sub { mati "Sampai jumpa!" },
"gila" => \&marah,
);

print "Apa kabar?";
chomp($string = );
if ($perintah{$string}) {
$perintah{$string}->();
} Else {
print "Tidak ada perintah seperti itu: $string\n";
}

Mulai dari Perl 5.8, modul filter sumber, "Switch", juga dapat digunakan untuk mendapatkan switch
dan kasus. Penggunaannya sekarang tidak disarankan, karena tidak sepenuhnya kompatibel dengan aslinya
sakelar Perl 5.10, dan karena, karena diimplementasikan sebagai filter sumber, itu tidak
selalu bekerja sebagaimana dimaksud ketika sintaks kompleks terlibat.

Seterpercayaapakah Olymp Trade? Kesimpulan bisa I menangkap mengakses untuk tidak terdefinisi variabel, fungsi, or metode?
Metode AUTOLOAD, dibahas dalam "Pemuatan otomatis" di perlsub memungkinkan Anda menangkap panggilan ke
fungsi dan metode yang tidak ditentukan.

Ketika datang ke variabel tidak terdefinisi yang akan memicu peringatan di bawah "gunakan peringatan",
Anda dapat mempromosikan peringatan menjadi kesalahan.

gunakan peringatan FATAL => qw(tidak diinisialisasi);

Mengapa tidak bisa a metode termasuk in ini sama fillet be ditemukan?
Beberapa kemungkinan alasan: warisan Anda semakin membingungkan, Anda salah mengeja metodenya
nama, atau objek salah jenis. Lihat perlootut untuk detail tentang salah satu dari
kasus di atas. Anda juga dapat menggunakan "print ref($object)" untuk mengetahui kelas $object itu
diberkati ke.

Alasan lain yang mungkin untuk masalah adalah Anda telah menggunakan sintaks objek tidak langsung (mis.
"temukan Guru "Samy"") pada nama kelas sebelum Perl melihat bahwa paket seperti itu ada. Dia
paling bijaksana untuk memastikan semua paket Anda ditentukan sebelum Anda mulai menggunakannya, yang akan
berhati-hatilah jika Anda menggunakan pernyataan "gunakan" alih-alih "memerlukan". Jika tidak, pastikan untuk
gunakan notasi panah (mis., "Guru->find("Samy")") sebagai gantinya. Notasi objek dijelaskan dalam
perlobj.

Pastikan untuk membaca tentang membuat modul di perlmod dan bahaya objek tidak langsung di
"Metode Doa" di perlobj.

Seterpercayaapakah Olymp Trade? Kesimpulan bisa I menemukan di luar my arus or panggilan paket?
(disumbangkan oleh brian d foy)

Untuk menemukan paket Anda saat ini, gunakan literal khusus "__PACKAGE__", sebagai
didokumentasikan dalam perldata. Anda hanya dapat menggunakan literal khusus sebagai token terpisah, jadi Anda
tidak dapat menginterpolasinya menjadi string seperti yang Anda bisa dengan variabel:

$current_package saya = __PACKAGE__;
print "Saya dalam paket $current_package\n";

Jika Anda ingin menemukan paket yang memanggil kode Anda, mungkin untuk memberikan diagnostik yang lebih baik sebagai
Carp melakukannya, gunakan built-in "penelepon":

bawahan {
@args saya = ...;
my( $package, $filename, $line ) = pemanggil;

print "Saya dipanggil dari paket $package\n";
);

Secara default, program Anda dimulai di paket "utama", jadi Anda akan selalu berada di beberapa paket.

Ini berbeda dengan mencari tahu paket sebuah objek diberkati, yang mungkin tidak
menjadi paket saat ini. Untuk itu, gunakan "diberkati" dari Scalar::Util, bagian dari Standar
Perpustakaan sejak Perl 5.8:

gunakan Skalar::Util qw(diberkati);
$object_package saya = diberkati( $object );

Sebagian besar waktu, Anda seharusnya tidak peduli dengan paket apa sebuah objek diberkati, karena
selama ia mengklaim mewarisi dari kelas itu:

my $is_right_class = eval { $object->isa( $package ) }; # benar atau salah

Dan, dengan Perl 5.10 dan yang lebih baru, Anda tidak perlu memeriksa warisan untuk melihat apakah
objek dapat menangani peran. Untuk itu, Anda dapat menggunakan "DOES", yang berasal dari "UNIVERSAL":

my $class_does_it = eval { $object->DOES( $role ) }; # benar atau salah

Anda dapat dengan aman mengganti "isa" dengan "MELAKUKAN" (walaupun kebalikannya tidak benar).

Seterpercayaapakah Olymp Trade? Kesimpulan bisa I komentar di luar a besar blok of Perl kode?
(disumbangkan oleh brian d foy)

Cara cepat dan kotor untuk mengomentari lebih dari satu baris Perl adalah dengan mengelilinginya
baris dengan arahan Pod. Anda harus meletakkan arahan ini di awal baris
dan di suatu tempat di mana Perl mengharapkan pernyataan baru (jadi tidak di tengah pernyataan seperti
komentar). Anda mengakhiri komentar dengan "=cut", mengakhiri bagian Pod:

= polong

my $object = NotGonnaHappen->new();

diabaikan_sub();

$tidak akan_ditugaskan = 37;

= potong

Metode cepat-dan-kotor hanya berfungsi dengan baik ketika Anda tidak berencana untuk meninggalkan kode yang dikomentari
dalam sumber. Jika parser Pod muncul, komentar multiline Anda akan muncul di
terjemahan Pod. Cara yang lebih baik untuk menyembunyikannya dari parser Pod juga.

Arahan "=begin" dapat menandai bagian untuk tujuan tertentu. Jika pengurai Pod
tidak mau menanganinya, hanya mengabaikannya. Beri label pada komentar dengan "komentar". Akhiri
komentar menggunakan "=end" dengan label yang sama. Anda masih memerlukan "=cut" untuk kembali ke Perl
kode dari komentar Pod:

=mulai komentar

my $object = NotGonnaHappen->new();

diabaikan_sub();

$tidak akan_ditugaskan = 37;

=akhiri komentar

= potong

Untuk informasi lebih lanjut tentang Pod, lihat perlpod dan perlpodspec.

Seterpercayaapakah Olymp Trade? Kesimpulan do I jelas a paket?
Gunakan kode ini, yang disediakan oleh Mark-Jason Dominus:

sub scrub_paket {
tidak ada 'referensi' yang ketat;
$paket saya = shift;
die "Seharusnya tidak menghapus paket utama"
jika $pack eq "" || $pack eq "utama";
$simpanan saya = *{$pack . '::'}{HASH};
$nama saya;
foreach $name (kunci %$ simpanan) {
$nama lengkap saya = $pack . '::' . $nama;
# Singkirkan semuanya dengan nama itu.
undef $$nama lengkap;
undef @$nama lengkap;
undef %$nama lengkap;
undef &$nama lengkap;
undef *$nama lengkap;
}
}

Atau, jika Anda menggunakan rilis Perl terbaru, Anda bisa menggunakan
Simbol::delete_package() fungsi sebagai gantinya.

Seterpercayaapakah Olymp Trade? Kesimpulan bisa I menggunakan a variabel as a variabel nama?
Pemula sering berpikir mereka ingin memiliki variabel yang berisi nama variabel.

$fred = 23;
$varname = "fred";
++$$namawarna; # $fred sekarang 24

Ini bekerja kadang-kadang, tetapi itu adalah ide yang sangat buruk karena dua alasan.

Alasan pertama adalah karena teknik ini hanya bekerja on global variabel. Artinya jika
$fred adalah variabel leksikal yang dibuat dengan Ku() dalam contoh di atas, kode tidak akan berfungsi
sama sekali: Anda secara tidak sengaja mengakses global dan melewati leksikal pribadi
sama sekali. Variabel global buruk karena mereka dapat dengan mudah bertabrakan secara tidak sengaja dan masuk
umum membuat kode yang tidak dapat diskalakan dan membingungkan.

Referensi simbolis dilarang di bawah pragma "gunakan ketat". Mereka tidak benar
referensi dan akibatnya tidak referensi-dihitung atau sampah-dikumpulkan.

Alasan lain mengapa menggunakan variabel untuk menyimpan nama variabel lain adalah ide yang buruk
adalah bahwa pertanyaannya sering kali berasal dari kurangnya pemahaman tentang struktur data Perl,
khususnya hash. Dengan menggunakan referensi simbolik, Anda hanya menggunakan paket
hash simbol-tabel (seperti %main::) alih-alih hash yang ditentukan pengguna. Solusinya adalah dengan menggunakan
hash Anda sendiri atau referensi nyata sebagai gantinya.

$USER_VARS{"fred"} = 23;
my $varname = "fred";
$USER_VARS{$varname}++; # bukan $$varname++

Di sana kami menggunakan hash %USER_VARS alih-alih referensi simbolis. Terkadang ini
muncul dalam membaca string dari pengguna dengan referensi variabel dan ingin memperluas
mereka ke nilai variabel program Perl Anda. Ini juga ide yang buruk karena
menggabungkan namespace yang dapat dialamatkan program dan yang dapat dialamatkan pengguna. Dari pada
membaca string dan memperluasnya ke konten aktual dari variabel program Anda sendiri:

$str = 'ini memiliki $fred dan $barney di dalamnya';
$str =~ s/(\$\w+)/$1/eeg; # perlu evaluasi ganda

akan lebih baik untuk menyimpan hash seperti %USER_VARS dan memiliki referensi variabel
sebenarnya merujuk ke entri dalam hash itu:

$str =~ s/\$(\w+)/$USER_VARS{$1}/g; # tidak /e di sini sama sekali

Itu lebih cepat, lebih bersih, dan lebih aman daripada pendekatan sebelumnya. Tentu saja, Anda tidak perlu
menggunakan tanda dolar. Anda bisa menggunakan skema Anda sendiri untuk membuatnya tidak terlalu membingungkan, seperti tanda kurung
simbol persen, dll.

$str = 'ini memiliki %fred% dan %barney% di dalamnya';
$str =~ s/%(\w+)%/$USER_VARS{$1}/g; # tidak /e di sini sama sekali

Alasan lain mengapa orang terkadang berpikir mereka ingin variabel berisi nama a
variabel adalah bahwa mereka tidak tahu bagaimana membangun struktur data yang tepat menggunakan hash. Untuk
contoh, katakanlah mereka menginginkan dua hash dalam program mereka: %fred dan %barney, dan itu
mereka ingin menggunakan variabel skalar lain untuk merujuk ke variabel tersebut dengan nama.

$nama = "fred";
$$nama{ISTERI} = "wilma"; # atur %fred

$nama = "barney";
$$nama{ISTERI} = "betty"; # atur %barney

Ini masih referensi simbolis, dan masih dibebani dengan masalah yang disebutkan
di atas. Akan jauh lebih baik untuk menulis:

$folks{"fred"}{WIFE} = "wilma";
$folks{"barney"}{WIFE} = "betty";

Dan cukup gunakan hash bertingkat untuk memulai.

Satu-satunya saat Anda benar-benar harus gunakan referensi simbolis adalah saat Anda benar-benar harus
lihat tabel simbol. Ini mungkin karena itu adalah sesuatu yang tidak bisa dianggap nyata
referensi, seperti nama format. Melakukannya mungkin juga penting untuk pemanggilan metode,
karena ini selalu melalui tabel simbol untuk resolusi.

Dalam kasus tersebut, Anda akan mematikan "'ref' ketat" sementara sehingga Anda dapat bermain-main dengan
tabel simbol. Sebagai contoh:

@colors = qw(merah biru hijau kuning oranye ungu ungu);
untuk $namaku (@warna) {
tidak ada 'referensi' yang ketat; # mengingkari blok
*$nama = sub { " @_ " };
}

Semua fungsi tersebut (merah(), biru(), hijau(), dll.) tampak terpisah, tetapi sebenarnya
kode dalam penutupan sebenarnya dikompilasi hanya sekali.

Jadi, terkadang Anda mungkin ingin menggunakan referensi simbolik untuk memanipulasi tabel simbol
secara langsung. Ini tidak masalah untuk format, pegangan, dan subrutin, karena mereka
selalu global--Anda tidak dapat menggunakan Ku() pada mereka. Untuk skalar, array, dan hash, meskipun--dan
biasanya untuk subrutin-- Anda mungkin hanya ingin menggunakan referensi keras.

Apa tidak "buruk penerjemah" artinya?
(disumbangkan oleh brian d foy)

Pesan "penerjemah buruk" berasal dari shell, bukan perl. Pesan sebenarnya mungkin berbeda
tergantung pada platform, shell, dan pengaturan lokal Anda.

Jika Anda melihat "penerjemah buruk - tidak ada file atau direktori seperti itu", baris pertama di perl . Anda
script (baris "shebang") tidak berisi jalur yang benar ke Perl (atau program lainnya
mampu menjalankan skrip). Terkadang ini terjadi ketika Anda memindahkan skrip dari satu
mesin ke mesin lainnya dan setiap mesin memiliki jalur yang berbeda untuk perl--/usr/bin/Perl lawan
/usr/local/bin/perl misalnya. Ini juga dapat menunjukkan bahwa mesin sumber memiliki CRLF
terminator saluran dan mesin tujuan hanya memiliki LF: shell mencoba menemukan
/usr/bin/Perl, tapi tidak bisa.

Jika Anda melihat "penerjemah buruk: Izin ditolak", Anda harus membuat skrip Anda dapat dieksekusi.

Dalam kedua kasus tersebut, Anda masih dapat menjalankan skrip dengan Perl secara eksplisit:

% skrip perl.pl

Jika Anda mendapatkan pesan seperti "perl: command not found", perl tidak ada di PATH Anda, yang mungkin
juga berarti bahwa lokasi perl tidak sesuai dengan yang Anda harapkan sehingga Anda perlu menyesuaikan
garis shebang.

Do I perlu untuk mengkompilasi ulang XS modul ketika sana is a perubahan in itu C Perpustakaan?
(disumbangkan oleh Alex Beamish)

Jika versi baru pustaka C kompatibel dengan ABI (itu adalah Antarmuka Biner Aplikasi
kompatibel) dengan versi yang Anda tingkatkan, dan jika versi perpustakaan bersama
tidak berubah, tidak diperlukan kompilasi ulang.

PENULIS DAN HAK CIPTA


Hak Cipta (c) 1997-2013 Tom Christiansen, Nathan Torkington, dan penulis lain sebagaimana disebutkan.
Seluruh hak cipta.

Dokumentasi ini gratis; Anda dapat mendistribusikan ulang dan/atau memodifikasinya dengan persyaratan yang sama
sebagai Perl itu sendiri.

Terlepas dari distribusinya, semua contoh kode dalam file ini dengan ini ditempatkan di
domain publik. Anda diizinkan dan didorong untuk menggunakan kode ini dalam program Anda sendiri
untuk bersenang-senang atau untuk keuntungan sesuai keinginan Anda. Komentar sederhana dalam kode yang memberikan kredit adalah
sopan tapi tidak wajib.

Gunakan perlfaq7 online menggunakan layanan onworks.net


Server & Workstation Gratis

Unduh aplikasi Windows & Linux

  • 1
    Toolbox untuk Java/JTOpen
    Toolbox untuk Java/JTOpen
    Toolbox IBM untuk Java / JTOpen adalah a
    perpustakaan kelas Java mendukung
    client/server dan pemrograman internet
    model ke sistem yang menjalankan OS/400,
    i5/OS, atau...
    Unduh Toolbox untuk Java/JTOpen
  • 2
    D3.js
    D3.js
    D3.js (atau D3 untuk Dokumen Berbasis Data)
    adalah perpustakaan JavaScript yang memungkinkan Anda
    untuk menghasilkan data yang dinamis dan interaktif
    visualisasi di browser web. Dengan D3
    kamu...
    Unduh D3.js
  • 3
    Shadowsocks
    Shadowsocks
    Proksi terowongan cepat yang membantu Anda
    melewati firewall Ini adalah aplikasi
    yang juga dapat diambil dari
    https://sourceforge.net/projects/shadowsocksgui/.
    itu ha...
    Unduh Shadowsocks.dll
  • 4
    Tema GLPI
    Tema GLPI
    Unduh rilis di
    https://github.com/stdonato/glpi-modifications/
    Tema warna untuk GLPI 0.84 dan 0.85 Baru
    Modifikasi untuk GLPI Ini adalah
    aplikasi yang...
    Unduh Tema GLPI
  • 5
    SMPlayer
    SMPlayer
    SMPlayer adalah pemutar media gratis untuk
    Windows dan Linux dengan codec bawaan
    yang juga dapat memutar video YouTube. Satu
    dari fitur yang paling menarik dari
    Pemain SMP:...
    Ambil SMPlayer
  • 6
    AAX ke MP3
    AAX ke MP3
    Penggunaan: - Instal Manajer Audible
    dan buka file akun Anda. - Tanda
    masuk ke akun Anda yang dapat didengar (di
    aplikasi). Sekarang programnya bisa
    mengubahmu...
    Unduh AAX ke MP3
  • Lebih banyak lagi »

Perintah Linux

Ad