Ini ialah arahan perlpragma 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
perlpragma - cara menulis pragma pengguna
DESCRIPTION
Pragma ialah modul yang mempengaruhi beberapa aspek masa penyusunan atau masa larian
tingkah laku Perl, seperti "ketat" atau "amaran". Dengan Perl 5.10 anda tidak lagi
terhad kepada pragmata terbina dalam; anda kini boleh mencipta pragmata pengguna yang mengubah suai
tingkah laku fungsi pengguna dalam skop leksikal.
A asas contoh
Sebagai contoh, katakan anda perlu mencipta kelas yang melaksanakan matematik terlampau beban
operator, dan ingin menyediakan pragma anda sendiri yang berfungsi seperti "use
integer;" Anda mahukan kod ini
gunakan MyMaths;
my $l = MyMaths->new(1.2);
my $r = MyMaths->new(3.4);
cetak "A: ", $l + $r, "\n";
gunakan myint;
cetak "B: ", $l + $r, "\n";
{
tiada myint;
cetak "C: ", $l + $r, "\n";
}
cetak "D: ", $l + $r, "\n";
tiada myint;
cetak "E: ", $l + $r, "\n";
untuk memberikan output
A: 4.6
B: 4
C: 4.6
D:4
E: 4.6
iaitu, di mana "gunakan myint;" sedang berkuat kuasa, operasi tambah dipaksa kepada integer, sedangkan
secara lalai mereka tidak, dengan tingkah laku lalai dipulihkan melalui "no myint;"
Pelaksanaan minimum pakej "MyMaths" adalah seperti ini:
pakej MyMaths;
gunakan amaran;
gunakan ketat;
gunakan myint();
gunakan lebihan '+' => sub {
saya ($l, $r) = @_;
# Lulus 1 untuk menyemak satu tahap panggilan dari sini
jika (myint::dalam kesan(1)) {
int($$l) + int($$r);
} Lain {
$$l + $$r;
}
};
sub baru {
my ($class, $value) = @_;
memberkati \$nilai, $kelas;
}
1;
Perhatikan bagaimana kami memuatkan pengguna pragma "myint" dengan senarai kosong "()" untuk mengelakkan "import"nya
sedang dipanggil.
Interaksi dengan kompilasi Perl berlaku di dalam pakej "myint":
pakej myint;
gunakan ketat;
gunakan amaran;
sub import {
$^H{"myint/in_effect"} = 1;
}
sub nyahimport {
$^H{"myint/in_effect"} = 0;
}
sub in_effect {
my $level = shift // 0;
$hinthash saya = (pemanggil($level))[10];
kembalikan $hinthash->{"myint/in_effect"};
}
1;
Memandangkan pragmata dilaksanakan sebagai modul, seperti mana-mana modul lain, "gunakan myint;" menjadi
BERMULA {
memerlukan myint;
myint->import();
}
dan "tiada myint;" ialah
BERMULA {
memerlukan myint;
myint->unimport();
}
Oleh itu rutin "import" dan "nyahimport" dipanggil di menyusun masa untuk kod pengguna.
Pragmata pengguna menyimpan keadaan mereka dengan menulis kepada cincang ajaib "%^H", oleh itu kedua-duanya
rutin memanipulasinya. Maklumat keadaan dalam "%^H" disimpan dalam optree, dan boleh
diambil baca sahaja pada masa jalan dengan "pemanggil()", pada indeks 10 senarai yang dikembalikan
keputusan. Dalam contoh pragma, pengambilan semula dimasukkan ke dalam rutin "in_effect()",
yang mengambil sebagai parameter bilangan bingkai panggilan untuk naik untuk mencari nilai
pragma dalam skrip pengguna. Ini menggunakan "pemanggil()" untuk menentukan nilai
$^H{"myint/in_effect"} apabila setiap baris skrip pengguna dipanggil, dan oleh itu
berikan semantik yang betul dalam subrutin yang melaksanakan penambahan terlampau beban.
Utama menamakan
Terdapat hanya satu "%^H", tetapi sewenang-wenangnya banyak modul yang ingin menggunakan skopnya
semantik. Untuk mengelak daripada memijak jari kaki masing-masing, mereka perlu memastikan menggunakan yang berbeza
kunci dalam cincang. Oleh itu, adalah konvensional untuk modul hanya menggunakan kekunci yang bermula
dengan nama modul (nama pakej utamanya) dan aksara "/". Selepas ini
awalan mengenal pasti modul, selebihnya kunci terserah sepenuhnya kepada modul: ia mungkin
sertakan mana-mana aksara sekalipun. Sebagai contoh, modul "Foo::Bar" harus menggunakan kekunci sedemikian
sebagai "Foo::Bar/baz" dan "Foo::Bar/$%/_!". Modul yang mengikuti konvensyen ini semuanya berfungsi dengan baik
antara satu sama lain.
Teras Perl menggunakan segelintir kunci dalam "%^H" yang tidak mengikut konvensyen ini, kerana
mereka mendahuluinya. Kunci yang mengikuti konvensyen tidak akan bercanggah dengan kunci teras
kunci sejarah.
Pelaksanaan butir-butir
Optree dikongsi antara urutan. Ini bermakna terdapat kemungkinan bahawa optree
akan hidup lebih lama daripada urutan tertentu (dan oleh itu contoh penterjemah) yang dibuat
ia, maka skalar Perl benar tidak boleh disimpan dalam optree. Sebaliknya bentuk padat digunakan,
yang hanya boleh menyimpan nilai integer (ditandatangani dan tidak ditandatangani), rentetan atau "undef" -
rujukan dan nilai titik terapung adalah bertali. Jika anda perlu menyimpan berbilang
nilai atau struktur kompleks, anda harus mensirikannya, contohnya dengan "pek". The
pemadaman kunci cincang daripada "%^H" direkodkan, dan seperti biasa boleh dibezakan daripada
kewujudan kunci dengan nilai "undef" dengan "wujud".
jangan cuba untuk menyimpan rujukan kepada struktur data sebagai integer yang diambil melalui
"pemanggil" dan ditukar kembali, kerana ini tidak akan selamat untuk benang. Akses adalah kepada
struktur tanpa mengunci (yang tidak selamat untuk skalar Perl), dan sama ada struktur
perlu bocor, atau ia perlu dibebaskan apabila benang penciptaannya ditamatkan, yang mungkin
sebelum rujukan optree ia dipadamkan, jika urutan lain hidup lebih lama.
Gunakan perlpragma dalam talian menggunakan perkhidmatan onworks.net