Ini adalah perintah perlos2 yang dapat dijalankan di penyedia hosting gratis OnWorks menggunakan salah satu dari beberapa workstation online gratis kami seperti Ubuntu Online, Fedora Online, emulator online Windows atau emulator online MAC OS
PROGRAM:
NAMA
perlos2 - Perl di bawah OS/2, DOS, Win0.3*, Win0.95 dan WinNT.
RINGKASAN
Seseorang dapat membaca dokumen ini dalam format berikut:
pria perlos2
lihat perl perlos2
penjelajah perlos2.html
info perlos2
untuk membuat daftar beberapa (tidak semua mungkin tersedia secara bersamaan), atau mungkin dibaca as is: baik sebagai
README.os2, atau pod/perlos2.pod.
Untuk membaca .INF versi dokumentasi (sangat direkomendasikan) di luar OS/2, seseorang membutuhkan
Pembaca IBM (mungkin tersedia di situs ftp IBM (?) (URL siapa saja?)) atau dikirimkan dengan PC DOS
7.0 dan IBM Visual Age C++ 3.5.
Salinan penampil Win* terdapat dalam paket "Tambahkan saja OS/2 Warp"
ftp://ftp.software.ibm.com/ps/products/os2/tools/jaow/jaow.zip
in ?:\JUST_ADD\view.exe. Ini memberi seseorang akses ke EMX's .INF dokumen juga (bentuk teks adalah
tersedia di /emx/doc dalam distribusi EMX). Ada juga penampil berbeda bernama
xview
Perhatikan bahwa jika Anda memiliki lynx.exe or netscape.exe diinstal, Anda dapat mengikuti tautan WWW dari
dokumen ini di .INF format. Jika Anda telah menginstal dokumen EMX dengan benar, Anda dapat mengikuti
tautan perpustakaan (Anda harus memiliki "lihat emxbook" yang berfungsi dengan mengatur lingkungan "EMXBOOK"
variabel seperti yang dijelaskan dalam dokumen EMX).
DESKRIPSI
target
Targetnya adalah menjadikan OS/2 salah satu platform terbaik yang didukung untuk
menggunakan/membangun/mengembangkan Perl dan Perl aplikasi, serta menjadikan Perl yang terbaik
bahasa untuk digunakan di bawah OS/2. Target kedua adalah mencoba membuat ini bekerja di bawah DOS dan
Menangkan* juga (tetapi tidak terlalu keras).
Keadaan saat ini cukup dekat dengan target ini. Batasan yang diketahui:
· Beberapa program *nix menggunakan garpu() banyak; dengan rasa Perl yang paling berguna untuk OS/2
(ada beberapa yang dibangun secara bersamaan) ini didukung; tapi beberapa rasa tidak
mendukung ini (misalnya, ketika Perl dipanggil dari dalam REXX). Menggunakan garpu() setelah menggunakaning
ekstensi yang memuat secara dinamis tidak akan berfungsi dengan sangat versi lama dari EMX.
· Anda memerlukan perl terpisah yang dapat dieksekusi perl__exe (lihat "perl__.exe") jika Anda ingin menggunakan
Kode PM di aplikasi Anda (seperti yang dilakukan modul Perl/Tk atau OpenGL Perl) tanpa harus
jendela mode teks hadir.
Saat menggunakan standar perl.exe dari jendela mode teks juga dimungkinkan, saya punya
terlihat kasus ketika ini menyebabkan penurunan stabilitas sistem. Menggunakan perl__exe
menghindari degradasi seperti itu.
· Tidak ada cara sederhana untuk mengakses objek WPS. Satu-satunya cara yang saya tahu adalah melalui "OS2::REXX"
dan ekstensi "SOM" (lihat OS2::REXX, SOM). Namun, kami tidak memiliki akses ke
metode kenyamanan Object-REXX. (Apakah mungkin? Saya tidak tahu Object-REXX
API.) Ekstensi "SOM" (saat ini dalam teks alfa) pada akhirnya dapat menghapus ini
kekurangan; namun, karena DII tidak didukung oleh modul "SOM",
menggunakan "SOM" tidak senyaman yang diinginkan.
Harap perbarui daftar ini dengan memberi tahu saya tentang item lainnya.
Lainnya OS
Karena OS/2 port perl menggunakan lingkungan EMX yang luar biasa, ia dapat menjalankan (dan membangun
ekstensi, dan - mungkin - dibangun sendiri) di bawah lingkungan apa pun yang dapat menjalankan EMX. Itu
daftar saat ini adalah DOS, DOS-dalam-OS/2, Win0.3*, Win0.95 dan WinNT. Dari banyak perl
rasa, hanya satu yang berfungsi, lihat "perl_.exe".
Perhatikan bahwa tidak semua fitur Perl tersedia di lingkungan ini. Ini tergantung pada
fitur-fiturnya memperpanjang - kemungkinan besar RSX - memutuskan untuk menerapkan.
lihat "Prasyarat".
Prasyarat
EMX EMX runtime diperlukan (dapat diganti dengan RSX). Perhatikan bahwa adalah mungkin untuk
membuat perl_.exe untuk berjalan di bawah DOS tanpa dukungan eksternal dengan mengikat
emx.exe/rsx.exe untuk itu, lihat "emxbind". Perhatikan bahwa di bawah DOS untuk hasil terbaik satu
harus menggunakan runtime RSX, yang memiliki lebih banyak fungsi yang berfungsi (seperti "garpu", "popen"
dan seterusnya). Sebenarnya RSX diperlukan jika tidak ada VCPI. Perhatikan RSX
membutuhkan DPMI. Banyak implementasi DPMI yang diketahui sangat buggy, awas!
Hanya runtime terbaru yang didukung, saat ini "0.9d fix 03". Perl dapat berjalan di bawah
versi EMX sebelumnya, tetapi ini tidak diuji.
Seseorang bisa mendapatkan bagian EMX yang berbeda dari, katakanlah
ftp://crydee.sai.msu.ru/pub/comp/os/os2/leo/gnu/emx+gcc/
http://hobbes.nmsu.edu/h-browse.php?dir=/pub/os2/dev/emx/v0.9d/
Komponen runtime harus memiliki nama emxrt.zip.
CATATAN. Ketika menggunakan emx.exe/rsx.exe, itu sudah cukup untuk memiliki mereka di jalan Anda. Satu tidak
tidak perlu menentukannya secara eksplisit (meskipun ini
emx perl_.exe -de 0
akan bekerja juga.)
RSX Untuk menjalankan Perl pada platform DPMI, seseorang membutuhkan runtime RSX. Ini diperlukan di bawah
DOS-dalam-OS/2, Win0.3*, Win0.95 dan WinNT (lihat "OS lainnya"). RSX tidak akan berfungsi
dengan VCPI saja, seperti halnya EMX, ini membutuhkan DMPI.
Memiliki RSX dan yang terbaru sh.exe seseorang mendapat fungsi penuh * nixlingkungan -ish
di bawah DOS, katakanlah, "garpu", "``" dan pipa-"buka" bekerja. Faktanya, MakeMaker berfungsi (untuk
static build), sehingga seseorang dapat memiliki lingkungan pengembangan Perl di bawah DOS.
Seseorang bisa mendapatkan RSX dari, katakanlah
http://cd.textfiles.com/hobbesos29804/disk1/EMX09C/
ftp://crydee.sai.msu.ru/pub/comp/os/os2/leo/gnu/emx+gcc/sumbangan/
Hubungi penulis di "[email dilindungi]".
Terbaru sh.exe dengan kait DOS tersedia di
http://www.ilyaz.org/software/os2/
as sh_dos.zip atau dengan nama yang mirip dimulai dengan "sh", "pdksh" dll.
HPFS Perl tidak peduli dengan sistem file, tetapi perpustakaan Perl berisi banyak file dengan
nama yang panjang, jadi untuk menginstalnya secara utuh diperlukan sistem file yang mendukung file panjang
nama.
Perhatikan bahwa jika Anda tidak berencana untuk membangun perl itu sendiri, mungkin saja Anda akan tertipu
EMX untuk memotong nama file. Ini tidak didukung, baca dokumen EMX untuk melihat bagaimana melakukannya
.
pdksh Untuk memulai program eksternal dengan baris perintah yang rumit (seperti dengan pipa di
antara, dan/atau mengutip argumen), Perl menggunakan shell eksternal. Dengan port EMX
cangkang seperti itu harus diberi nama sh.exe, dan terletak baik di wired-in-selama-kompilasi
lokasi (biasanya F:/tempat sampah), atau di lokasi yang dapat dikonfigurasi (lihat "PERL_SH_DIR").
Untuk hasil terbaik gunakan EMX pdksh. Biner standar (5.2.14 atau lebih baru) berjalan di bawah DOS
(dengan "RSX") juga, lihat
http://www.ilyaz.org/software/os2/
Mulai Perl program bawah OS / 2 (Dan DOS dan...)
Mulai program Perl Anda foo.pl dengan argumen "arg1 arg2 arg3" dengan cara yang sama seperti pada sembarang
platform lain, oleh
perl foo.pl arg1 arg2 arg3
Jika Anda ingin menentukan opsi Perl "-my_opts" ke perl itu sendiri (berlawanan dengan Anda
program), gunakan
perl -my_opts foo.pl arg1 arg2 arg3
Sebagai alternatif, jika Anda menggunakan shell OS/2-ish, seperti CMD atau 4os2, letakkan yang berikut di awal
dari skrip Perl Anda:
extproc perl -S -my_opts
ganti nama program Anda menjadi foo.cmd, dan mulai dengan mengetik
foo arg1 arg2 arg3
Perhatikan bahwa karena keterbatasan OS/2 yang bodoh, jalur lengkap skrip Perl tidak
tersedia saat Anda menggunakan "extproc", sehingga Anda terpaksa menggunakan sakelar Perl "-S", dan Anda
skrip harus di "PATH". Sebagai sisi positifnya, jika Anda mengetahui jalur lengkap ke skrip Anda,
Anda masih bisa memulainya dengan
Perl ../../blah/foo.cmd arg1 arg2 arg3
(perhatikan bahwa argumen "-my_opts" ditangani oleh baris "extproc" di skrip Anda,
lihat ""extproc" di baris pertama").
Untuk memahami apa yang di atas sihir tidak, baca dokumen Perl tentang sakelar "-S" - lihat perlrun,
dan cmdref tentang "extproc":
lihat perl perlrun
pria perlrun
lihat cmdref extproc
bantu extproc
atau metode apa pun yang Anda inginkan.
Ada juga kemungkinan tak terbatas untuk digunakan executable ekstensi dari 4os2, asosiasi of
WPS dan seterusnya... Namun, jika Anda menggunakan *nixish shell (seperti sh.exe disediakan dalam biner
distribusi), Anda harus mengikuti sintaks yang ditentukan dalam "Sakelar Perintah" di perlrun.
Perhatikan bahwa -S switch mendukung skrip dengan ekstensi tambahan . Cmd, .btm, Bat., Pl as
baik.
Mulai OS / 2 (Dan KEMBALI) program bawah Perl
Ini apa sistem() (lihat "sistem" di perlfunc), "``" (lihat "Operator I/O" di perlop),
dan Buka pipa (lihat "buka" di perlfunc) adalah untuk. (Menghindari exec () (lihat "exec" di perlfunc)
kecuali Anda tahu apa yang Anda lakukan).
Namun perhatikan bahwa untuk menggunakan beberapa operator ini, Anda harus memiliki shell sintaksis-sh
diinstal (lihat "Pdksh", "Pertanyaan yang sering diajukan"), dan Perl harus dapat menemukannya
(lihat "PERL_SH_DIR").
Kasus-kasus ketika shell digunakan adalah:
1. Satu-argumen sistem() (lihat "sistem" di perlfunc), exec () (lihat "exec" di perlfunc) dengan
pengalihan atau karakter meta shell;
2. Buka pipa (lihat "buka" di perlfunc) dengan perintah yang berisi pengalihan atau
karakter meta shell;
3. Backticks "``" (lihat "Operator I/O" di perlop) dengan perintah yang berisi
pengalihan atau karakter meta shell;
4. Jika executable dipanggil oleh sistem()/exec ()/pipa-Buka()/"``" adalah skrip dengan
"ajaib" "#!" baris atau baris "extproc" yang menentukan shell;
5. Jika executable dipanggil oleh sistem()/exec ()/pipa-Buka()/"``" adalah skrip tanpa
baris "magic", dan $ENV{EXECSHELL} disetel ke shell;
6. Jika executable dipanggil oleh sistem()/exec ()/pipa-Buka()/"``" tidak ditemukan (bukan ini
komentar usang?);
7. Untuk globbing (lihat "glob" di perlfunc, "Operator I/O" di perlop) (usang? Perl menggunakan
builtin globbing saat ini ...).
Demi kecepatan untuk kasus umum, dalam algoritma di atas garis miring terbalik di
nama perintah tidak dianggap sebagai karakter meta shell.
Perl memulai skrip yang dimulai dengan cookie "extproc" atau "#!" langsung, tanpa
intervensi cangkang. Perl menggunakan algoritma yang sama untuk menemukan executable sebagai pdksh: jika
jalur di "#!" baris tidak berfungsi, dan berisi "/", maka bagian direktori dari
executable diabaikan, dan executable dicari di . dan pada "JALAN". Mencari
argumen untuk skrip ini Perl menggunakan algoritma yang berbeda dari pdksh: hingga 3 argumen
dikenali, dan spasi tambahan dilucuti.
Jika skrip tidak mengandung cookie seperti itu, maka untuk menghindari panggilan sh.exe, Perl menggunakan
algoritma yang sama dengan pdksh: jika $ENV{EXECSHELL} disetel, skrip diberikan sebagai yang pertama
argumen untuk perintah ini, jika tidak disetel, maka "$ENV{COMSPEC} /c" digunakan (atau
tebak jika $ENV{COMSPEC} tidak disetel).
Saat memulai skrip secara langsung, Perl menggunakan algoritme yang persis sama seperti untuk mencari
naskah yang diberikan oleh -S opsi baris perintah: itu akan terlihat di direktori saat ini, lalu aktif
komponen $ENV{PATH} menggunakan urutan ekstensi yang ditambahkan berikut: tanpa ekstensi,
. Cmd, .btm, Bat., Pl.
Perhatikan bahwa Perl akan mulai mencari skrip hanya jika OS/2 tidak dapat memulai yang ditentukan
aplikasi, sehingga "sistem 'bla'" tidak akan mencari skrip jika ada yang dapat dieksekusi
fillet bla.exe di manapun pada "JALAN". Dengan kata lain, "PATH" pada dasarnya dicari dua kali:
sekali oleh OS untuk yang dapat dieksekusi, kemudian oleh Perl untuk skrip.
Perhatikan juga bahwa file yang dapat dieksekusi pada OS/2 dapat memiliki ekstensi arbitrer, tetapi exe akan
otomatis ditambahkan jika tidak ada titik dalam nama. Solusinya sesederhana
bahwa: sejak bla. dan bla menunjukkan file yang sama (pada daftar pada sistem file FAT dan HPFS),
untuk memulai executable yang berada di file n:/bin/bla (tanpa ekstensi) berikan argumen
"n:/bin/bla." (titik ditambahkan) ke sistem().
Perl akan memulai program PM dari proses Perl VIO (=text-mode) dalam sesi PM terpisah;
kebalikannya tidak benar: ketika Anda memulai program non-PM dari proses PM Perl, Perl
tidak akan menjalankannya dalam sesi terpisah. Jika sesi terpisah diinginkan, pastikan
shell itu akan digunakan, seperti pada "system 'cmd /c myprog'", atau mulai menggunakan opsional
argumen untuk sistem() didokumentasikan dalam modul "OS2::Process". Ini dianggap sebagai
fitur.
Sering bertanya pertanyaan
"Dia tidak tidak bekerja"
Distribusi biner Perl hadir dengan a testperl.cmd skrip yang mencoba mendeteksi common
masalah dengan instalasi yang salah konfigurasi. Ada kemungkinan yang cukup besar itu akan
temukan langkah instalasi mana yang berhasil Anda salahkan. ";-)"
I tidak bisa menjalankan luar program
· Apakah Anda menjalankan program dengan sakelar "-w"? Lihat "Memulai program OS/2 (dan DOS)
di bawah Perl".
· Apakah Anda mencoba lari intern perintah shell, seperti "`copy ab`" (internal untuk cmd.exe),
atau "`glob a*b`" (internal untuk ksh)? Anda perlu menentukan shell Anda secara eksplisit, seperti
"`cmd /c copy ab`", karena Perl tidak dapat menyimpulkan perintah mana yang internal untuk . Anda
kulit.
I tidak bisa menanamkan perl ke my program or menggunakan perl.dll dari my program.
Apakah program Anda dikompilasi EMX dengan "-Zmt -Zcrtdll"?
Nah, saat ini Perl DLL harus dapat digunakan dari program yang dikompilasi secara berbeda juga ...
Jika Anda dapat menjalankan kode Perl dari skrip REXX (lihat OS2::REXX), maka ada beberapa lainnya
aspek interaksi yang diabaikan oleh kode peretasan saat ini untuk mendukung
program utama yang dikompilasi secara berbeda.
Jika semuanya gagal, Anda perlu membangun DLL yang berdiri sendiri untuk Perl. Hubungi saya, saya
melakukannya sekali. Soket tidak akan berfungsi, seperti banyak hal lainnya.
Apakah Anda menggunakan ExtUtils::Embed?
Beberapa waktu lalu saya mendapat laporan tidak berfungsi. Saat ini diperiksa dalam tes Perl
suite, jadi grep ./T subdirektori dari pohon build (serta *.T file di ./ lib
subdirektori) untuk menemukan bagaimana hal itu harus dilakukan "dengan benar".
"``" dan pipa-"terbuka" do tidak kerja bawah DUA.
Ini mungkin varian dari "Saya tidak dapat menjalankan program eksternal", atau masalah yang lebih dalam.
Pada dasarnya: kamu perlu RSX (lihat "Prasyarat") agar perintah ini berfungsi, dan Anda mungkin perlu
sebuah pelabuhan sh.exe yang memahami argumen perintah. Salah satu port tersebut tercantum di
"Prasyarat" di bawah RSX. Jangan lupa untuk mengatur variabel "PERL_SH_DIR" juga.
DPMI diperlukan untuk RSX.
Tidak bisa awal "temukan.exe "pola" mengajukan"
Seluruh gagasan "API C standar untuk memulai aplikasi" adalah bahwa bentuk "foo" dan
"foo" argumen program benar-benar dapat dipertukarkan. menemukan mematahkan paradigma ini;
temukan file "pola"
temukan file pola
tidak setara; menemukan tidak dapat dimulai secara langsung menggunakan API di atas. Seseorang membutuhkan cara
untuk mengelilingi tanda kutip ganda dalam beberapa konstruksi kutipan lainnya, tentu memiliki
shell non-Unixish ekstra di antaranya.
Gunakan salah satu dari
sistem 'cmd', '/c', 'temukan file "pola"';
`cmd /c 'menemukan file "pola"'`
Ini akan dimulai temukan.exe melalui cmd.exe melalui "sh.exe" melalui "perl.exe", tetapi ini adalah harga untuk
bayar jika Anda ingin menggunakan program yang tidak sesuai.
INSTALASI
secara otomatis biner instalasi
Cara paling mudah untuk menginstal distribusi biner perl adalah melalui penginstal perl
install.exe. Ikuti saja instruksinya, dan 99% blues instalasi akan berjalan
pergi.
Namun perhatikan, bahwa Anda harus memiliki unzip.exe di jalur Anda, dan lingkungan EMX berjalan.
Yang terakhir berarti bahwa jika Anda baru saja menginstal EMX, dan membuat semua perubahan yang diperlukan untuk
config.sys, Anda mungkin perlu melakukan boot ulang di antaranya. Periksa runtime EMX dengan menjalankan
emxrev
Penginstal biner juga membuat folder di desktop Anda dengan beberapa objek yang berguna. Jika kamu
perlu mengubah beberapa aspek pekerjaan penginstal biner, jangan ragu untuk mengedit
fillet Perl.pkg. Ini mungkin berguna misalnya, jika Anda perlu menjalankan penginstal berkali-kali dan
tidak ingin membuat banyak perubahan interaktif di GUI.
Hal tidak diambil yang of by otomatis biner instalasi:
"PERL_BADLANG" mungkin diperlukan jika Anda mengubah halaman kode Anda setelah instalasi perl, dan
nilai baru tidak didukung oleh EMX. Lihat "PERL_BADLANG".
"PERL_BADFREE" lihat "PERL_BADFREE".
config.pm File ini berada di suatu tempat jauh di dalam lokasi Anda menginstal perl
perpustakaan, cari tahu dengan
perl -MConfig -le "cetak $INC{'Config.pm'}"
Sementara nilai yang paling penting dalam file ini adalah diperbarui oleh biner
installer, beberapa di antaranya mungkin perlu diedit secara manual. Saya tidak tahu data seperti itu,
tolong beri tahu saya jika Anda menemukannya. Selain itu, perubahan manual pada
versi yang diinstal mungkin perlu disertai dengan pengeditan file ini.
CATATAN. Karena salah ketik, penginstal biner 5.00305 akan menginstal variabel
"PERL_SHPATH" ke dalam config.sys. Harap hapus variabel ini dan masukkan "PERL_SH_DIR" sebagai gantinya.
panduan biner instalasi
Pada versi 5.00305, distribusi biner OS/2 perl terbagi menjadi 11 komponen.
Sayangnya, untuk mengaktifkan instalasi biner yang dapat dikonfigurasi, jalur file dalam file zip
tidak mutlak, tetapi relatif terhadap beberapa direktori.
Perhatikan bahwa ekstraksi dengan jalur tersimpan masih diperlukan (default dengan unzip,
tentukan "-d" ke pkunzip). Namun, Anda perlu tahu di mana untuk mengekstrak file. Anda membutuhkan
juga untuk mengubah entri secara manual di config.sys untuk mencerminkan di mana Anda meletakkan file. Catatan
bahwa jika Anda memiliki beberapa unzipper primitif (seperti "pkunzip"), Anda mungkin mendapatkan banyak
peringatan/kesalahan saat membuka ritsleting. Tingkatkan ke "(w)unzip".
Di bawah ini adalah contoh apa yang harus dilakukan untuk mereproduksi konfigurasi pada mesin saya. Di
LIHAT.EXE Anda dapat menekan "Ctrl-Insert" sekarang, dan cut-and-paste dari file yang dihasilkan -
dibuat di direktori yang Anda mulai LIHAT.EXE dari.
Untuk setiap komponen, kami menyebutkan variabel lingkungan yang terkait dengan setiap instalasi
direktori. Pilih direktori yang sesuai dengan nilai variabel Anda, atau
buat/tambahkan-ke variabel untuk memperhitungkan direktori.
Perl VIO dan PM yang dapat dieksekusi (terhubung secara dinamis)
unzip perl_exc.zip *.exe *.ico -df:/emx.add/bin
unzip perl_exc.zip *.dll -df:/emx.add/dll
(memiliki direktori dengan "*.exe" di PATH, dan "*.dll" di LIBPATH);
Perl_ VIO dapat dieksekusi (tertaut secara statis)
unzip perl_aou.zip -df:/emx.add/bin
(memiliki direktori di PATH);
Dapat dieksekusi untuk utilitas Perl
unzip perl_utl.zip -df:/emx.add/bin
(memiliki direktori di PATH);
Perpustakaan Perl utama
unzip perl_mlb.zip -df:/perllib/lib
Jika direktori ini persis sama dengan awalan yang dikompilasi menjadi perl.exe,
Anda tidak perlu mengubah apa pun. Namun, untuk Perl untuk menemukan perpustakaan jika Anda menggunakan
jalur yang berbeda, Anda perlu "mengatur PERLLIB_PREFIX" di config.sys, lihat "PERLLIB_PREFIX".
Modul Perl tambahan
unzip perl_ste.zip -df:/perllib/lib/site_perl/5.22.1/
Pernyataan yang sama seperti di atas berlaku. Selain itu, jika direktori ini bukan salah satu dari
direktori di @INC (dan @INC dipengaruhi oleh "PERLLIB_PREFIX"), Anda harus meletakkan ini
direktori dan subdirektori ./os2 dalam variabel "PERLLIB" atau "PERL5LIB". Jangan gunakan
"PERL5LIB" kecuali Anda sudah mengaturnya. Lihat "LINGKUNGAN" di perl.
[Memeriksa apakah ini ekstraksi direktori is masih berlaku dengan itu yang baru direktori
struktur tata letak!]
Alat untuk mengkompilasi modul Perl
unzip perl_blb.zip -df:/perllib/lib
Komentar yang sama untuk perl_ste.zip.
Halaman manual untuk Perl dan utilitas
unzip perl_man.zip -df:/perllib/man
Direktori ini sebaiknya berada di "MANPATH". Anda harus memiliki pekerjaan pria untuk mengakses
file-file ini.
Halaman manual untuk modul Perl
unzip perl_mam.zip -df:/perllib/man
Direktori ini sebaiknya berada di "MANPATH". Anda harus memiliki orang yang bekerja untuk mengakses
file-file ini.
Sumber untuk dokumentasi Perl
unzip perl_pod.zip -df:/perllib/lib
Ini digunakan oleh program "perldoc" (lihat perldoc), dan dapat digunakan untuk menghasilkan HTML
dokumentasi yang dapat digunakan oleh browser WWW, dan dokumentasi dalam jutaan format lain:
"info", "LaTeX", "Acrobat", "FrameMaker" dan seterusnya. [Gunakan program seperti pod2latex
dll.]
manual Perl di .INF format
unzip perl_inf.zip -dd:/os2/book
Direktori ini sebaiknya berada di "BOOKSHELF".
Pdksh
unzip perl_sh.zip -df:/tempat sampah
Ini digunakan oleh Perl untuk menjalankan perintah eksternal yang secara eksplisit membutuhkan shell, seperti
perintah menggunakan redirection dan tempurung karakter meta. Itu juga digunakan sebagai pengganti
eksplisit / Bin / sh.
Setel "PERL_SH_DIR" (lihat "PERL_SH_DIR") jika Anda pindah sh.exe dari lokasi di atas.
Catatan. Dimungkinkan untuk menggunakan beberapa shell lain yang kompatibel dengan sh (belum diuji).
Setelah Anda menginstal komponen yang Anda butuhkan dan memperbarui config.sys sesuai,
Anda perlu mengedit tangan config.pm. File ini berada di suatu tempat jauh di dalam lokasi Anda
instal perpustakaan Perl Anda, temukan dengan
perl -MConfig -le "cetak $INC{'Config.pm'}"
Anda perlu memperbaiki semua entri yang terlihat seperti jalur file (saat ini dimulai dengan
"F:/").
peringatan
Instalasi Perl otomatis dan manual meninggalkan jalur yang telah dikompilasi di dalam perl
executable Meskipun jalur ini dapat ditimpa (lihat "PERLLIB_PREFIX", "PERL_SH_DIR"),
beberapa orang mungkin lebih suka mengedit jalur biner di dalam file yang dapat dieksekusi/DLL.
Mengakses dokumentasi
Bergantung pada bagaimana Anda membuat/menginstal Perl, Anda mungkin memiliki (jika tidak identik) Perl
dokumentasi dalam format berikut:
OS / 2 .INF fillet
Kemungkinan besar bentuk yang paling nyaman. Di bawah OS/2 melihatnya sebagai
lihat perl
lihat perl perlfunc
lihat perl lebih sedikit
lihat Perl ExtUtils::MakeMaker
(saat ini dua yang terakhir mungkin mengenai lokasi yang salah, tetapi ini mungkin akan segera membaik). Di bawah Menang*
lihat "SINOPSIS".
Jika Anda ingin membuat dokumen sendiri, dan memiliki OS / 2 toolkit, lari
pod2ipf > perl.ipf
in /perllib/lib/pod direktori, maka
ipfc /inf perl.ipf
(Mengharapkan banyak kesalahan selama kedua langkah.) Sekarang pindahkan ke jalur BOOKSHELF Anda.
Polos teks
Jika Anda memiliki dokumentasi Perl dalam bentuk sumber, utilitas Perl terinstal, dan GNU groff
diinstal, Anda dapat menggunakan
perldoc perlfunc
perldoc kurang
perldoc ExtUtils::MakeMaker
untuk mengakses dokumentasi Perl dalam bentuk teks (perhatikan bahwa Anda mungkin mendapatkan hasil yang lebih baik
menggunakan halaman manual Perl).
Sebagai alternatif, coba jalankan pod2text on .polong file.
halaman manual
Jika Anda memiliki pria diinstal pada sistem Anda, dan Anda menginstal halaman manual Perl, gunakan sesuatu
seperti ini:
pria perlfunc
pria 3 lebih sedikit
man ExtUtils.MakeMaker
untuk mengakses dokumentasi untuk berbagai komponen Perl. Dimulai dari
pria perl
Perhatikan bahwa titik (.) digunakan sebagai pemisah paket untuk dokumentasi paket, dan sebagai
biasa, terkadang Anda perlu memberikan bagian - 3 di atas - untuk menghindari bayangan oleh
kurang(1) halaman manual.
Pastikan bahwa direktori atas direktori dengan halaman manual ada di "MANPATH" kami, seperti
ini
atur MANPATH=c:/man;f:/perllib/man
untuk halaman manual Perl di "f:/perllib/man/man1/" dll.
HTML
Jika Anda memiliki beberapa browser WWW yang tersedia, instal dokumentasi Perl di sumbernya
form, dan utilitas Perl, Anda dapat membuat dokumen HTML. Cd ke direktori dengan .polong file, dan lakukan
begini
cd f:/perllib/lib/pod
pod2html
Setelah ini, Anda dapat mengarahkan file ke browser Anda perl.html di direktori ini, dan lanjutkan
dengan membaca dokumen, seperti ini:
jelajahi file:///f:/perllib/lib/pod/perl.html
Atau, Anda mungkin bisa mendapatkan dokumen ini yang dibuat sebelumnya dari CPAN.
GNU "informasi" arsip
Pengguna Emacs akan sangat menghargainya, terutama dengan mode "CPerl" yang dimuat. Anda
perlu mendapatkan "pod2texi" terbaru dari "CPAN", atau, secara bergantian, halaman info bawaan.
PDF arsip
untuk "Acrobat" tersedia di CPAN (mungkin untuk versi Perl yang sedikit lebih lama).
"Getah" docs
dapat dibangun menggunakan "pod2latex".
MEMBANGUN
Di sini kita membahas bagaimana membangun Perl di bawah OS/2.
The pendek cerita
Asumsikan bahwa Anda adalah seorang porter berpengalaman, jadi pastikan bahwa semua alat yang diperlukan adalah
sudah ada di sistem Anda, dan Anda tahu cara mendapatkan distribusi sumber Perl.
Buka tarnya, ubah ke direktori ekstrak, dan
gnupatch -p0 < os2\diff.configure
sh Konfigurasikan -des -D awalan=f:/perllib
membuat
buat tes
make install
buat out_test
buat aout_install
Ini menempatkan executable di f:/perllib/bin. Pindahkan secara manual ke "PATH", secara manual
pindahkan yang dibangun perl*.dll ke "LIBPATH" (di sini untuk Perl DLL * adalah hex yang tidak terlalu berarti
checksum), dan jalankan
buat installcmd INSTALLCMDDIR=d:/ir/on/path
Dengan asumsi bahwa file "pria" diletakkan di lokasi yang sesuai, ini melengkapi
instalasi sistem Perl minimal. (Distribusi biner juga mengandung banyak
modul tambahan, dan dokumentasi dalam format INF.)
Berikut ini adalah panduan terperinci melalui langkah-langkah ini.
Prasyarat
Anda harus memiliki lingkungan pengembangan EMX terbaru, rangkaian alat GNU lengkap (gawk
berganti nama menjadi awk, dan GNU temukan.exe lebih awal di jalur daripada OS/2 temukan.exe, sama dengan
sortir.exe, untuk memeriksa penggunaan
temukan --versi
urutkan --versi
). Anda memerlukan versi terbaru dari pdksh dipasang sebagai sh.exe.
Periksa apakah Anda memiliki BSD perpustakaan dan header diinstal, dan - opsional - Berkeley DB
header dan library, dan crypt.
Kemungkinan lokasi untuk mendapatkan file:
ftp://ftp.uni-heidelberg.de/pub/os2/unix/
http://hobbes.nmsu.edu/h-browse.php?dir=/pub/os2
http://cd.textfiles.com/hobbesos29804/disk1/DEV32/
http://cd.textfiles.com/hobbesos29804/disk1/EMX09C/
Dilaporkan bahwa arsip berikut berisi cukup utilitas untuk membangun Perl:
gnfutil.zip, gnusutil.zip, gnututil.zip, gnuse.zip, gnupatch.zip, gnuwk.zip,
gnumake.zip, gnugrep.zip, bsddev.zip dan ksh527rt.zip (atau versi yang lebih baru). Perhatikan bahwa semua
utilitas ini diketahui tersedia dari LEO:
ftp://crydee.sai.msu.ru/pub/comp/os/os2/leo/gnu/
Perhatikan juga bahwa db.lib dan db.a dari distribusi EMX tidak cocok untuk multi-
kompilasi berulir (bahkan rasa utas tunggal Perl menggunakan C RTL multi-utas, untuk
kompatibilitas dengan XFree86-OS/2). Dapatkan yang dikoreksi dari
http://www.ilyaz.org/software/os2/db_mt.zip
Jika Anda memiliki persis itu sama versi of Perl sudah diinstal, pastikan tidak ada salinan
atau Perl sedang berjalan. Langkah-langkah pembangunan selanjutnya mungkin gagal karena versi yang lebih lama
of perl.dll dimuat ke dalam memori dapat ditemukan. Menjalankan "make test" menjadi tidak berarti,
karena tes sedang memeriksa build perl sebelumnya (situasi ini terdeteksi dan
dilaporkan oleh lib/os2_base.t tes). Jangan lupa untuk menghapus "PERL_EMXLOAD_SEC" di
lingkungan.
Pastikan juga Anda memiliki / Tmp direktori pada drive saat ini, dan . direktori di Anda
"LIBPAT". Seseorang dapat mencoba untuk memperbaiki kondisi terakhir dengan
setel BEGINLIBPATH .\.
jika Anda menggunakan sesuatu seperti CMD.EXE atau versi terbaru dari 4os2.exe. (Mengatur BEGINLIBPATH
untuk hanya "." diabaikan oleh kernel OS/2.)
Pastikan gcc Anda bagus untuk penautan "-Zomf": jalankan skrip "omflibs" di /emx/lib
direktori.
Periksa apakah Anda telah menginstal link386. Itu datang standar dengan OS/2, tapi mungkin tidak
dipasang karena penyesuaian. Jika mengetik
link386
menunjukkan Anda tidak memilikinya, lakukan Selektif install, dan pilih "Tautkan modul objek" di
Opsional sistem utilitas/Lainnya. Jika Anda masuk ke link386 prompt, tekan "Ctrl-C" untuk keluar.
Mendapatkan perl sumber
Anda perlu mengambil sumber perl terbaru (termasuk rilis pengembang). Dengan beberapa
kemungkinan terletak di
http://www.cpan.org/src/
http://www.cpan.org/src/unsupported
Jika tidak, Anda mungkin perlu menggali indeks untuk menemukannya di direktori saat ini
pemelihara
Siklus rilis pengembang yang cepat dapat merusak waktu pembuatan OS/2, melihat ke dalam
http://www.cpan.org/ports/os2/
mungkin menunjukkan rilis terbaru yang dirilis secara publik oleh pengelola. Perhatikan bahwa
rilis mungkin menyertakan beberapa tambalan tambahan untuk diterapkan ke sumber perl saat ini.
Ekstrak seperti ini
tar vzxf perl5.00409.tar.gz
Anda mungkin melihat pesan tentang kesalahan saat mengekstrak Konfigurasi. Hal ini karena ada
konflik dengan file bernama serupa mengkonfigurasi.
Ubah ke direktori ekstraksi.
Aplikasi of itu patch
Anda perlu menerapkan tambalan di ./os2/diff.* seperti ini:
gnupatch -p0 < os2\diff.configure
Anda mungkin juga perlu menerapkan patch yang disertakan dengan distribusi biner perl. Dia
juga masuk akal untuk melihat milis perl5-porters untuk OS/2 terbaru yang terkait
tambalan (lihathttp://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/>). Tambalan seperti itu
biasanya berisi string "/os2/" dan "patch", jadi masuk akal untuk mencari string ini.
Pengeditan tangan
Anda dapat melihat ke dalam file ./petunjuk/os2.sh dan perbaiki kesalahan yang Anda temukan di sana. saya bersedia
tidak berharap itu dibutuhkan di mana saja.
Membuat
sh Konfigurasikan -des -D awalan=f:/perllib
"awalan" berarti: di mana menginstal perpustakaan Perl yang dihasilkan. Memberikan awalan yang benar, Anda boleh
hindari kebutuhan untuk menentukan "PERLLIB_PREFIX", lihat "PERLLIB_PREFIX".
mengabaikan itu pesan tentang hilang "dalam", dan tentang "-C" Option untuk tr. Yang terakhir adalah yang paling
mungkin sudah diperbaiki, jika Anda melihatnya dan dapat melacak di mana peringatan palsu yang terakhir
berasal dari, tolong beri tahu saya.
Sekarang
membuat
Pada suatu saat yang dibangun mungkin mati, melaporkan versi ketidakcocokan or tidak mampu untuk menjalankan perl.
Ini berarti bahwa Anda tidak memiliki . di LIBPATH Anda, jadi perl.exe tidak dapat menemukan yang dibutuhkan
perl67B2.dll (perlakukan digit hex ini sebagai kebisingan garis). Setelah ini diperbaiki, build seharusnya
selesai tanpa banyak keributan.
pengujian
Sekarang jalankan
buat tes
Semua tes harus berhasil (dengan beberapa di antaranya dilewati). Jika Anda memiliki versi yang sama dari
Perl diinstal, sangat penting bahwa Anda memiliki "." di awal LIBPATH Anda (atau di
BEGINLIBPATH), jika tidak, pengujian Anda kemungkinan besar akan menguji versi Perl yang salah.
Beberapa tes dapat menghasilkan pesan tambahan yang mirip dengan
Banyak "bebas yang buruk"
dalam tes database yang terkait dengan Berkeley DB. Kredensial mikro harus be tetap sudah. Jika
tetap ada, Anda dapat menonaktifkan peringatan ini, lihat "PERL_BADFREE".
Proses dihentikan oleh SIGTERM/SIGINT
Ini adalah pesan standar yang dikeluarkan oleh aplikasi OS/2. *aplikasi nix mati dalam
kesunyian. Itu dianggap sebagai fitur. Seseorang dapat dengan mudah menonaktifkan ini dengan yang sesuai
pengeluh.
Namun mesin uji mengalirkan pesan ini ke layar di saat-saat yang tidak terduga. Dua
pesan semacam ini harus hadir selama pengujian.
Untuk mendapatkan laporan pengujian yang lebih baik, hubungi
perl t/memanfaatkan
Laporan dengan io/pipa.t gagal mungkin terlihat seperti ini:
Status Tes Gagal Wstat Total Gagal Daftar gagal
-------------------------------------------------- ----------
io/pipe.t 12 1 8.33% 9
7 tes dilewati, ditambah 56 subtes dilewati.
Gagal 1/195 skrip pengujian, 99.49% oke. 1/6542 subtes gagal, 99.98% oke.
Alasan untuk sebagian besar tes yang dilewati adalah:
op/fs.t
18 Cek "atime" dan "mtime" dari "stat()" - sayangnya, HPFS hanya menyediakan
Granularitas waktu 2 detik (untuk kompatibilitas dengan FAT?).
25 Cek "truncate()" pada filehandle yang baru saja dibuka untuk menulis - Saya tidak tahu mengapa
ini harus atau tidak harus bekerja.
op/stat.t
Centang "stat()". Tes:
4 Cek "atime" dan "mtime" dari "stat()" - sayangnya, HPFS hanya menyediakan
Granularitas waktu 2 detik (untuk kompatibilitas dengan FAT?).
Instalasi itu dibangun di perl
Jika Anda belum memindahkan "perl*.dll" ke LIBPATH, lakukan sekarang.
Run
make install
Itu akan menempatkan file yang dihasilkan ke lokasi yang dibutuhkan. Letakkan secara manual perl.exe, perl__exe
dan perl___exe ke lokasi di PATH Anda, perl.dll ke lokasi di LIBPATH Anda.
Run
buat installcmd INSTALLCMDDIR=d:/ir/on/path
untuk mengonversi utilitas perl ke . Cmd file dan meletakkannya di PATH. Anda harus meletakkan
EXE.-utilitas di jalur secara manual. Mereka dipasang di "$prefix/bin", di sini $prefix adalah apa
kamu berikan kepada Konfigurasi, lihat "Membuat".
Jika Anda menggunakan "man", pindahkan yang diinstal */manusia/ direktori ke "MANPATH" Anda, atau
ubah "MANPATH" agar sesuai dengan lokasi. (Seseorang bisa menghindari ini dengan memberikan
opsi "manpath" yang benar untuk ./configure, atau mengedit ./config.sh antara mengonfigurasi dan
membuat langkah.)
"a.out"-style membangun
Lanjutkan seperti di atas, tetapi buat perl_.exe (lihat "perl_.exe") oleh
buat perl_
uji dan instal oleh
buat out_test
buat aout_install
Letakkan secara manual perl_.exe ke lokasi di PATH Anda.
Catatan. Proses pembuatan untuk "perl_" tidak tidak tahu tentang semua dependensi, jadi Anda
harus memastikan bahwa semuanya mutakhir, katakanlah, dengan melakukan
buat perl_dll
pertama.
Bangunan a biner distribusi
[Bagian ini hanya memberikan gambaran singkat...]
Membangun harus berjalan secara berbeda tergantung pada apakah versi perl yang Anda instal
sudah ada dan digunakan di sistem Anda, atau versi baru belum digunakan. Itu
deskripsi di bawah ini mengasumsikan bahwa versinya baru, jadi instal DLL-nya dan .sore arsip
tidak akan mengganggu pengoperasian sistem Anda meskipun beberapa langkah perantara belum dilakukan
sepenuhnya bekerja.
Kasus-kasus lain memerlukan prosedur yang sedikit lebih berbelit-belit. Di bawah ini saya kira bahwa
versi Perl saat ini adalah 5.8.2, sehingga executable diberi nama yang sesuai.
1. Bangun dan uji distribusi Perl sepenuhnya. Pastikan tidak ada tes yang gagal dengan
target "test" dan "aout_test"; perbaiki bug di Perl dan suite uji Perl terdeteksi
oleh tes-tes ini. Pastikan "all_test" membuat target berjalan sebersih mungkin.
Periksa itu os2/perlrexx.cmd berjalan dengan baik.
2. Instal Perl sepenuhnya, termasuk target "installcmd". Salin DLL yang dihasilkan ke
"LIBPAT"; salin executable Perl bernomor (seperti pada perl5.8.2.exe) ke "JALAN"; salinan
"perl_.exe" menjadi "PATH" sebagai "perl_5.8.2.exe". Pikirkan apakah Anda perlu mundur-
kompatibilitas DLL. Dalam kebanyakan kasus, Anda belum perlu menginstalnya; tapi kadang-kadang
ini dapat menyederhanakan langkah-langkah berikut.
3. Pastikan "CPAN.pm" dapat mendownload file dari CPAN. Jika tidak, Anda mungkin perlu
instal "Net::FTP" secara manual.
4. Instal bundel "Bundle::OS2_default"
perl5.8.2 -MCPAN -e "instal Bundle::OS2_default" < nul |& tee 00cpan_i_1
Ini mungkin memakan waktu beberapa jam pada prosesor 1GHz (saat dijalankan pertama kali). Dan ini
tidak harus merupakan prosedur yang mulus. Beberapa modul mungkin tidak menentukan yang diperlukan
ketergantungan, jadi seseorang mungkin perlu mengulangi prosedur ini beberapa kali sampai hasilnya
menstabilkan.
perl5.8.2 -MCPAN -e "instal Bundle::OS2_default" < nul |& tee 00cpan_i_2
perl5.8.2 -MCPAN -e "instal Bundle::OS2_default" < nul |& tee 00cpan_i_3
Bahkan setelah stabil, beberapa tes mungkin gagal.
Perbaiki sebanyak mungkin bug yang ditemukan. Dokumentasikan semua bug yang belum diperbaiki,
dan semua kegagalan dengan alasan yang tidak diketahui. Periksa log yang dihasilkan 00cpan_i_1 untuk
menemukan tes yang terlewatkan secara mencurigakan, dan kejadian mencurigakan lainnya.
Perlu diingat bahwa instalasi dari beberapa modul mungkin juga gagal: misalnya, DLL untuk
pembaruan mungkin sudah dimuat oleh CPAN.pm. Periksa log "instal" (dalam contoh
atas 00cpan_i_1 dll) untuk kesalahan, dan instal semuanya secara manual, seperti pada
cd $CPANHOME/.cpan/build/Digest-MD5-2.31
make install
Beberapa distribusi mungkin gagal dalam beberapa pengujian, tetapi Anda mungkin tetap ingin menginstalnya (sebagai
di atas, atau melalui perintah "force install" dari mode shell "CPAN.pm").
Karena prosedur ini mungkin membutuhkan waktu yang cukup lama untuk diselesaikan, masuk akal untuk
"bekukan" konfigurasi CPAN Anda dengan menonaktifkan pembaruan berkala dari salinan lokal
Indeks CPAN: atur "index_expire" ke beberapa nilai besar (saya menggunakan 365), lalu simpan pengaturannya
CPAN> atau conf index_expire 365
CPAN> atau conf komit
Reset kembali ke nilai default 1 setelah Anda selesai.
5. Setelah puas dengan hasilnya, jalankan kembali target "installcmd". Sekarang Anda dapat menyalin
"perl5.8.2.exe" ke "perl.exe", dan instal executable OMF-build lainnya:
"perl__.exe" dll. Mereka siap digunakan.
6. Pindah ke direktori "./pod" dari build tree, download logo Perl
UntaAbu-abuBesar.BMP, dan lari
( perl2ipf > perl.ipf ) |& tee 00ipf
ipfc /INF perl.ipf |& tee 00inf
Ini menghasilkan buku online Perl docs "perl.INF". Instal di jalur "BOOKSHELF".
7. Sekarang saatnya untuk membangun executable yang terhubung secara statis perl_.exe yang termasuk baru-
diinstal melalui modul "Bundle::OS2_default". Melakukan pengujian melalui "CPAN.pm" akan
menjadi sangat lambat, karena secara statis menautkan executable baru per ekstensi XS.
Berikut adalah solusi yang mungkin: buat toplevel Makefile.PL in $CPANHOME/.cpan/build/
dengan konten menjadi (bandingkan dengan "Membuat executable dengan koleksi kustom
ekstensi yang dimuat secara statis")
gunakan ExtUtils::MakeMaker;
WriteMakefile NAMA => 'boneka';
jalankan ini sebagai
perl_5.8.2.exe Makefile.PL
buat -k semua tes
Sekali lagi, prosedur ini tidak boleh benar-benar mulus. Beberapa "Makefile.PL" ada di
subdirektori mungkin bermasalah, dan tidak akan berjalan sebagai skrip "anak". Itu
interdependensi modul dapat menyerang Anda; namun, karena modul non-XS sudah ada
diinstal, prasyarat dari sebagian besar modul memiliki peluang yang sangat baik untuk hadir.
Jika Anda menemukan beberapa gangguan, pindahkan direktori modul yang bermasalah ke direktori lain
lokasi; jika modul ini adalah modul non-XS, Anda dapat mengabaikannya - mereka adalah
sudah terpasang; sisanya, XS, modul yang perlu Anda instal secara manual satu per satu.
Setelah setiap penghapusan tersebut, Anda perlu menjalankan kembali proses "Makefile.PL"/"make"; biasanya
prosedur ini konvergen segera. (Tetapi pastikan untuk mengonversi semua C . eksternal yang diperlukan
perpustakaan dari .lib format ke .a format: jalankan salah satu dari
emxaout foo.lib
emximp -o foo.a foo.lib
mana saja yang sesuai.) Juga, pastikan bahwa DLL untuk perpustakaan eksternal adalah
dapat digunakan dengan dengan executable yang dikompilasi tanpa opsi "-Zmtd".
Ketika Anda yakin bahwa hanya beberapa subdirektori yang menyebabkan kegagalan, Anda mungkin ingin menambahkan
Opsi "-j4" untuk "membuat" untuk mempercepat melewatkan subdirektori dengan yang sudah selesai
membangun.
Saat Anda puas dengan hasil pengujian, instal pustaka build C untuk
ekstensi:
buat instal |& tee 00aout_i
Sekarang Anda dapat mengganti nama file ./perl.exe dihasilkan selama fase terakhir untuk
perl_5.8.2.exe; letakkan di "PATH"; jika ada ketergantungan antar beberapa XS
modul, Anda mungkin perlu mengulangi loop "test"/"install" dengan executable baru ini dan
beberapa modul yang dikecualikan - sampai prosedur menyatu.
Sekarang Anda memiliki semua yang diperlukan .a perpustakaan untuk modul Perl ini di tempat-tempat di mana
Pembangun Perl dapat menemukannya. Gunakan pembuat perl: ubah ke direktori kosong, buat
bodoh" Makefile.PL lagi, dan lari
perl_5.8.2.exe Makefile.PL |& tee 00c
buat perl |& tee 00p
Ini harus membuat executable ./perl.exe dengan semua ekstensi yang dimuat secara statis
bawaan. Bandingkan yang dihasilkan perlmain.c file untuk memastikan bahwa selama
iterasi jumlah ekstensi yang dimuat hanya meningkat. Ganti nama ./perl.exe untuk
perl_5.8.2.exe pada "JALAN".
Ketika konvergen, Anda mendapatkan varian fungsional dari perl_5.8.2.exe; salin ke
"perl_.exe". Anda selesai dengan pembuatan instalasi Perl lokal.
8. Pastikan modul yang terpasang benar-benar terpasang di lokasi yang baru
Perl, dan tidak diwarisi dari entri @INC yang diberikan untuk warisan dari yang lebih tua
versi Perl: atur "PERLLIB_582_PREFIX" untuk mengarahkan versi baru Perl ke
lokasi baru, dan salin file yang diinstal ke lokasi baru ini. Ulangi tes untuk
pastikan bahwa versi modul yang diwarisi dari versi Perl yang lebih lama tidak
dibutuhkan.
Sebenarnya, keluaran log dari pod2ipf(1) selama langkah 6 memberikan info yang sangat rinci
tentang modul mana yang dimuat dari tempat mana; jadi Anda dapat menggunakannya sebagai tambahan
alat verifikasi.
Periksa apakah beberapa file sementara tidak masuk ke perl install tree. Lari
sesuatu seperti ini
temukan. -f "!(/\.(pm|pl|ix|al|h|a|lib|txt|pod|imp|bs|dll|ld|bs|inc|xbm|yml|cgi|uu|e2x|lewati |packlist|misalnya|cfg|html|pub|enc|all|ini|po|pot)$/i atau /^\w+$/") | lebih sedikit
di pohon instal (baik yang teratas dan situs satu).
Kompres semua DLL dengan lxlite. Yang mungil exe dapat dikompresi dengan "/c:max" (the
bug hanya muncul ketika ada perbaikan di 6 byte terakhir halaman (?); sejak
executable kecil jauh lebih kecil dari halaman, bug tidak akan mengenai). Jangan kompres
"perl_.exe" - itu tidak akan bekerja di bawah DOS.
9. Sekarang Anda dapat menghasilkan distribusi biner. Ini dilakukan dengan menjalankan tes
Distribusi CPAN "OS2::SoftInstaller". Sesuaikan file tes.pl sesuai dengan tata letak
versi Perl saat ini terlebih dahulu. Jangan lupa untuk mengemas DLL eksternal yang diperlukan
demikian. Sertakan deskripsi bug dan kegagalan test suite yang Anda bisa
tidak pasti. Sertakan versi tumpukan kecil dari Perl yang dapat dieksekusi dari Perl build
direktori.
Memasukkan perl5.def sehingga orang dapat menautkan kembali DLL Perl dengan melestarikan biner
kompatibilitas, atau dapat membuat DLL kompatibilitas. Sertakan file diff ("diff -pu
lama baru") dari perbaikan yang Anda lakukan agar orang dapat membangun kembali versi Anda. Sertakan perl5.peta
sehingga seseorang dapat menggunakan debugging jarak jauh.
10. Bagikan apa yang Anda lakukan dengan orang lain. Santai. Nikmati buah dari pekerjaan Anda.
11. Bersiaplah untuk terima kasih, laporan bug, surat kebencian, dan spam yang datang sebagai akibat dari
langkah sebelumnya. Tidak ada perbuatan baik yang harus dibiarkan tanpa hukuman!
Bangunan adat EXE. arsip
Eksekusi Perl dapat dengan mudah dibangun kembali kapan saja. Selain itu, seseorang dapat menggunakan
embedding antarmuka (lihat perlembed) untuk membuat executable yang sangat disesuaikan.
Membuat executable dengan a adat koleksi of statis sarat ekstensi
Ini sedikit lebih mudah untuk melakukannya sambil penurunan daftar yang dimuat secara statis
ekstensi. Kami membahas kasus ini hanya di sini.
1. Ubah ke direktori kosong, dan buat placeholder :
gunakan ExtUtils::MakeMaker;
WriteMakefile NAMA => 'boneka';
2. Jalankan dengan rasa Perl (perl.exe or perl_.exe) Anda ingin membangun kembali.
perl_ Makefile.PL
3. Minta untuk membuat Perl baru yang dapat dieksekusi:
membuat perl
(Anda mungkin perlu menambahkan "PERLTYPE=-DPERL_CORE" secara manual ke baris perintah ini pada beberapa
versi Perl; gejalanya adalah globbing baris perintah tidak berfungsi dari
shell OS/2 dengan executable yang baru dikompilasi; periksa dengan
.\perl.exe -wle "cetak untuk @ARGV" *
).
4. Langkah sebelumnya dibuat perlmain.c yang berisi daftar baruXS() panggilan di dekat
akhir. Menghapus panggilan yang tidak perlu, dan menjalankan kembali
membuat perl
akan menghasilkan executable yang disesuaikan.
Membuat executable dengan a adat jalur pencarian
Perl executable default cukup fleksibel untuk mendukung sebagian besar penggunaan. Namun, seseorang mungkin
menginginkan sesuatu yang lebih fleksibel; misalnya, seseorang mungkin ingin menemukan Perl DLL relatif untuk
lokasi file EXE; atau seseorang mungkin ingin mengabaikan lingkungan saat menyetel
Patch pencarian perl-library, dll.
Jika Anda mengisi nyaman dengan embedding antarmuka (lihat perlembed), hal-hal seperti itu mudah dilakukan
lakukan ulangi langkah-langkah yang diuraikan dalam "Membuat executable dengan koleksi kustom
ekstensi yang dimuat secara statis", dan melakukan pengeditan yang lebih komprehensif untuk utama() of perlmain.c.
Orang-orang dengan sedikit keinginan untuk memahami Perl hanya dapat mengganti nama utama(), dan lakukan yang diperlukan
modifikasi dalam kebiasaan utama() yang memanggil fungsi yang diubah namanya dalam waktu yang tepat.
Namun, ada cara ketiga: Perl DLL mengekspor utama() fungsi dan beberapa panggilan balik
untuk menyesuaikan jalur pencarian. Di bawah ini adalah contoh lengkap dari "Perl loader" yang
1. Cari Perl DLL di direktori "$exedir/../dll";
2. Menambahkan direktori di atas ke "BEGINLIBPATH";
3. Gagal jika Perl DLL yang ditemukan melalui "BEGINLIBPATH" berbeda dari yang dimuat di
Langkah 1; misalnya, proses lain dapat memuatnya dari "LIBPATH" atau dari yang berbeda
nilai "BEGINLIBPATH". Dalam kasus ini, seseorang perlu memodifikasi pengaturan sistem
sehingga proses lain ini tidak berjalan, atau memuat DLL dari "BEGINLIBPATH"
dengan "LIBPATHSTRICT=T" (tersedia dengan kernel setelah September 2000).
4. Memuat perpustakaan Perl dari "$exedir/../dll/lib/".
5. Menggunakan shell Bourne dari "$exedir/../dll/sh/ksh.exe".
Untuk hasil terbaik, kompilasi file C di bawah ini dengan opsi yang sama dengan Perl DLL. Namun,
banyak fungsi akan berfungsi bahkan jika yang dapat dieksekusi bukan aplikasi EMX, misalnya,
jika dikompilasi dengan
gcc -Dinding -DDOSISH -DOS2=1 -O2 -s -Zomf -Zsys perl-starter.c \
-DPERL_DLL_BASENAME=\"perl312F\" -Zstack 8192 -Zlinker /PM:VIO
Berikut adalah contoh file C:
#tentukan INCL_DOS
#tentukan INCL_NOPM
/* Ini diperlukan untuk kompilasi jika os2.h menyertakan os2tk.h, bukan os2emx.h */
#definisikan INCL_DOSPROCESS
#termasuk
#sertakan "EKSTERN.h"
#menentukan PERL_IN_MINIPERLMAIN_C
#sertakan "perl.h"
karakter statis * saya;
pegangan HMODULE;
kekosongan statis
die_with(char *msg1, char *msg2, char *msg3, char *msg4)
{
ULONG c;
char *s = " kesalahan: ";
DosWrite(2, saya, strlen(saya), &c);
DosWrite(2, s, strlen(s), &c);
DosWrite(2, pesan1, strlen(pesan1), &c);
DosWrite(2, pesan2, strlen(pesan2), &c);
DosWrite(2, pesan3, strlen(pesan3), &c);
DosWrite(2, pesan4, strlen(pesan4), &c);
DosWrite(2, "\r\n", 2, &c);
keluar(255);
}
typedef ULONG (*fill_extLibpath_t)(tipe int, char *pre, char *post, int replace, char *msg);
typedef int (*main_t)(tipe int, char *argv[], char *env[]);
typedef int (*handler_t)(void* data, int yang);
#ifndef PERL_DLL_BASENAME
# tentukan PERL_DLL_BASENAME "perl"
#berakhir jika
HMODULE statis
load_perl_dll(char *nama dasar)
{
char buf[300], gagal[260];
STRLEN aku, dil;
isi_extLibpath_t f;
ULONG rc_nama lengkap;
HMODULE menangani, menangani1;
jika (nama_exec(buf, sizeof(buf) - 13) != 0)
die_with("Tidak dapat menemukan path lengkap: ", strerror(errno), "", "");
/* XXXX Isi 'saya' dengan nilai baru */
aku = strlen(buf);
while (l && buf[l-1] != '/' && buf[l-1] != '\\')
aku--;
dir = l - 1;
strcpy(buf + l, nama dasar);
l += strlen(nama dasar);
strcpy(buf + l, ".dll");
if ( (rc_fullname = DosLoadModule(fail, sizeof fail, buf, &handle)) != 0
&& DosLoadModule(gagal, sizeof fail, basename, &handle) != 0 )
die_with("Tidak dapat memuat DLL", buf, "", "");
jika (rc_nama lengkap)
pegangan kembali; /* dimuat dengan nama pendek; Semuanya baik baik saja */
jika (DosQueryProcAddr(pegangan, 0, "fill_extLibpath", (PFN*)&f))
die_with(buf, ": DLL tidak mengekspor simbol ", "fill_extLibpath", "");
buf[dirl] = 0;
if (f(0 /*BEGINLIBPATH*/, buf /* tambahkan */, NULL /* tambahkan */,
0 /* simpan nilai lama */, saya))
die_with(saya, ": mengawali BEGINLIBPATH", "", "");
if (DosLoadModule(fail, sizeof fail, basename, &handle1) != 0)
die_with(saya, ": menemukan Perl DLL lagi melalui BEGINLIBPATH", "", "");
buf[dirl] = '\\';
if (pegangan1 != pegangan) {
jika (DosQueryModuleName(handle1, sizeof(gagal), fail))
strcpy(gagal, "???");
die_with(buf, ":\n\tperl DLL melalui BEGINLIBPATH berbeda: \n\t",
gagal,
"\n\tAnda mungkin perlu memanipulasi BEGINLIBPATH dan LIBPATHSTRICT global"
"\n\tsehingga salinan lainnya dimuat melalui BEGINLIBPATH.");
}
pegangan kembali;
}
int
utama(int argc, char **argv, char **env)
{
main_tf;
pawang_t h;
saya = argv[0];
/ ** /
pegangan = load_perl_dll(PERL_DLL_BASENAME);
if (DosQueryProcAddr(handle, 0, "Perl_OS2_handler_install", (PFN*)&h))
die_with(PERL_DLL_BASENAME, ": DLL tidak mengekspor simbol ", "Perl_OS2_handler_install", "");
if ( !h((void *)"~installprefix", Perlos2_handler_perllib_from)
|| !h((void *)"~dll", Perlos2_handler_perllib_to)
|| !h((void *)"~dll/sh/ksh.exe", Perlos2_handler_perl_sh) )
die_with(PERL_DLL_BASENAME, ": Tidak dapat menginstal @INC manglers", "", "");
jika (DosQueryProcAddr(pegangan, 0, "dll_perlmain", (PFN*)&f))
die_with(PERL_DLL_BASENAME, ": DLL tidak mengekspor simbol ", "dll_perlmain", "");
kembali f(argc, argv, env);
}
Membangun FAQ (Pertanyaan Umum)
Beberapa "/" menjadi "\" in pdksh.
Anda memiliki pdksh yang sangat tua. Lihat "Prasyarat".
'salah' - belum terselesaikan luar
Anda tidak memiliki MT-safe db.lib. Lihat "Prasyarat".
Masalah dengan tr or sed
dilaporkan dengan versi tr dan sed yang sangat lama.
Beberapa masalah (lupa yang ;-)
Anda memiliki versi yang lebih lama dari perl.dll pada LIBPATH Anda, yang merusak pembangunan
ekstensi.
Perpustakaan ... tidak ditemukan
Anda tidak menjalankan "omflibs". Lihat "Prasyarat".
Kesalahan segmen in membuat
Anda menggunakan versi lama dari GNU make. Lihat "Prasyarat".
op/sprintf uji kegagalan
Ini dapat disebabkan oleh bug di emx sprintf yang telah diperbaiki pada 0.9d fix 03.
Spesifik (salah) fitur of OS / 2 pelabuhan
"prioritas", "mendapatkan prioritas"
Perhatikan bahwa fungsi ini kompatibel dengan *nix, bukan dengan port lama '94 - 95.
Prioritasnya mutlak, pergi dari 32 ke -95, lebih rendah lebih cepat. 0 adalah default
prioritas.
PERINGATAN. Memanggil "getpriority" pada proses yang tidak ada dapat mengunci sistem sebelumnya
Warp3 fixpak22. Dimulai dengan Warp3, Perl akan menggunakan solusi: itu dibatalkan dapatkan prioritas()
jika proses tidak ada. Ini tidak mungkin pada versi lama "2.*", dan memiliki
kondisi balapan pula.
"sistem()"
Bentuk multi-argumen "system()" memungkinkan argumen numerik tambahan. Arti dari
argumen ini dijelaskan dalam OS2::Proses.
Saat menemukan program untuk dijalankan, Perl pertama-tama meminta OS untuk mencari executable di "PATH"
(OS/2 menambahkan ekstensi exe jika tidak ada ekstensi). Jika tidak ditemukan, ia mencari
skrip dengan kemungkinan ekstensi ditambahkan dalam urutan ini: tanpa ekstensi, . Cmd, .btm, Bat., Pl.
Jika ditemukan, Perl memeriksa awal file untuk menemukan string ajaib "#!" dan "extproc". Jika
ditemukan, Perl menggunakan sisa baris pertama sebagai awal baris perintah untuk dijalankan
naskah ini. Satu-satunya mangling yang dilakukan pada baris pertama adalah ekstraksi argumen
(saat ini hingga 3), dan mengabaikan bagian jalur dari nama "penerjemah" jika tidak bisa
ditemukan menggunakan jalur lengkap.
Misalnya, "sistem 'foo', 'bar', 'baz'" dapat mengarahkan Perl untuk menemukan C:/emx/bin/foo.cmd pada pengatur terkenal. Pengatur ini menawarkan bantuan hukum kepada traderapabila trader berselisih dengan broker yang terdaftar dengan mereka.
baris pertama adalah
extproc / bin / bash -x -c
If /bin/bash.exe tidak ditemukan, maka Perl mencari yang dapat dieksekusi bash.exe pada "JALAN". Jika
ditemukan di C:/emx.add/bin/bash.exe, maka di atas sistem() diterjemahkan ke
sistem qw(C:/emx.add/bin/bash.exe -x -c C:/emx/bin/foo.cmd bar baz)
Satu terjemahan tambahan dilakukan: alih-alih / Bin / sh Perl menggunakan hardwired-or-
shell yang disesuaikan (lihat "PERL_SH_DIR").
Pencarian "interpreter" di atas bersifat rekursif: if menampar yang dapat dieksekusi tidak ditemukan, tetapi
bash.btm ditemukan, Perl akan menyelidiki baris pertamanya, dll. Satu-satunya batasan bawaan pada
kedalaman rekursi tersirat: ada batasan 4 pada jumlah argumen tambahan
dimasukkan sebelum argumen aktual yang diberikan kepada sistem(). Khususnya, jika tidak ada tambahan
argumen ditentukan pada baris pertama "ajaib", maka batas kedalamannya adalah 4.
Jika Perl menemukan bahwa executable yang ditemukan adalah tipe PM ketika sesi saat ini tidak, itu
akan memulai proses baru dalam sesi terpisah dari jenis yang diperlukan. Hubungi melalui
"OS2::Proses" untuk menonaktifkan sihir ini.
PERINGATAN. Karena logika yang dijelaskan, Anda perlu menentukan secara eksplisit .com ekstensi jika
diperlukan. Apalagi, jika dieksekusi perl5.6.1 diminta, Perl tidak akan mencari
perl5.6.1.exe. [Ini mungkin berubah di masa depan.]
"extproc" on itu pertama line
Jika karakter pertama dari skrip Perl adalah "extproc", baris ini diperlakukan sebagai baris "#!",
dengan demikian semua sakelar pada baris ini diproses (dua kali jika skrip dimulai melalui
cmd.exe). Lihat "DESKRIPSI" di perlrun.
Tambahan modul:
OS2::Proses, OS2::DLL, OS2::REXX, OS2::PrfDB, OS2::ExtAttr. Modul ini menyediakan akses
untuk argumen numerik tambahan untuk "sistem" dan informasi tentang yang sedang berjalan
proses, ke DLL yang memiliki fungsi dengan tanda tangan REXX dan ke runtime REXX, ke OS/2
database di .INI format, dan ke Atribut yang Diperluas.
Dua ekstensi tambahan oleh Andreas Kaiser, "OS2::UPM", dan "OS2::FTP", disertakan ke
Direktori "ILYAZ", dicerminkan di CPAN. Ekstensi terkait OS/2 lainnya juga tersedia.
Bawaan metode:
"File::Copy::syscopy"
digunakan oleh "File::Copy::copy", lihat File::Copy.
"DynaLoader::mod2fname"
digunakan oleh "DynaLoader" untuk mangling nama DLL.
"Cwd::current_drive()"
Cukup jelas.
"Cwd::sys_chdir(nama)"
meninggalkan drive apa adanya.
"Cwd::change_drive(nama)"
mengubah drive "saat ini".
"Cwd::sys_is_absolute(nama)"
berarti memiliki huruf drive dan is_rooted.
"Cwd::sys_is_rooted(nama)"
berarti memiliki awalan "[/\\]" (mungkin setelah huruf drive :).
"Cwd::sys_is_relative(nama)"
berarti perubahan dengan dir saat ini.
"Cwd::sys_cwd(nama)"
Antarmuka ke cwd dari EMX. Digunakan oleh "Cwd::cwd".
"Cwd::sys_abspath(nama, dir)"
Benar-benar fungsi yang sangat menjijikkan untuk diterapkan. Mengembalikan nama absolut file yang akan
memiliki "nama" jika CWD adalah "dir". "Dir" default ke dir saat ini.
"Cwd::extLibpath([jenis])"
Dapatkan nilai saat ini dari jalur pencarian perpustakaan yang diperluas. Jika "tipe" ada dan positif,
bekerja dengan "END_LIBPATH", jika negatif, bekerja dengan "LIBPATHSTRICT", jika tidak dengan
"BEGIN_LIBPATH".
"Cwd::extLibpath_set( jalur [, ketik ] )"
Tetapkan nilai saat ini dari jalur pencarian perpustakaan yang diperluas. Jika "tipe" ada dan positif,
bekerja dengan , jika negatif, bekerja dengan "LIBPATHSTRICT", jika tidak dengan
"BEGIN_LIBPATH".
"OS2::Error(do_harderror,do_exception)"
Mengembalikan "undef" jika belum dipanggil, jika tidak, bit 1 disetel jika pada sebelumnya
panggilan do_harderror diaktifkan, bit 2 disetel jika pada panggilan sebelumnya do_exception adalah
diaktifkan.
Fungsi ini mengaktifkan/menonaktifkan sembulan kesalahan yang terkait dengan kesalahan perangkat keras (Disk tidak
siap dll.) dan pengecualian perangkat lunak.
Saya tahu tidak ada cara untuk mengetahui keadaan popup sebelum panggilan pertama untuk ini
fungsi.
"OS2::Errors2Drive(drive)"
Mengembalikan "undef" jika belum dipanggil, jika tidak mengembalikan false jika tidak ada kesalahan
diminta untuk ditulis ke hard drive, atau huruf drive jika diminta.
Fungsi ini dapat mengarahkan sembulan kesalahan yang terkait dengan kesalahan perangkat keras (Disk tidak
siap dll.) dan pengecualian perangkat lunak untuk file POPUPLOG.OS2 di direktori root
penggerak yang ditentukan. Mengganti OS2::Kesalahan() ditentukan oleh program individu. Diberikan
argumen undef akan menonaktifkan pengalihan.
Memiliki efek global, tetap ada setelah aplikasi keluar.
Saya tidak tahu cara untuk mengetahui status pengalihan popup ke disk sebelum itu
panggilan pertama ke fungsi ini.
OS2::Info Sistem()
Mengembalikan hash dengan informasi sistem. Kunci hash adalah
MAX_PATH_LENGTH, MAX_TEXT_SESSIONS, MAX_PM_SESSIONS,
MAX_VDM_SESSIONS, BOOT_DRIVE, DYN_PRI_VARIATION,
MAX_WAIT, MIN_SLICE, MAX_SLICE, PAGE_SIZE,
VERSION_MAJOR, VERSION_MINOR, VERSION_REVISION,
MS_COUNT, TIME_LOW, TIME_HIGH, TOTPHYSMEM, TOTRESMEM,
TOTAVAILMEM, MAXPRMEM, MAXSHMEM, TIMER_INTERVAL,
MAX_COMP_LENGTH, FOREGROUND_FS_SESSION,
FOREGROUND_PROCESS
OS2::BootDrive()
Mengembalikan huruf tanpa titik dua.
"OS2::MorphPM(melayani)", "OS2::UnMorphPM(melayani)"
Mengubah aplikasi saat ini menjadi aplikasi PM dan kembali. Argumennya benar
berarti bahwa loop pesan nyata akan disajikan. OS2::MorphPM() mengembalikan PM
menangani antrian pesan sebagai bilangan bulat.
Lihat "Manajemen sumber daya terpusat" untuk detail tambahan.
"OS2::Serve_Messages(paksa)"
Pengambilan atas permintaan palsu dari pesan PM yang beredar. Jika "kekuatan" salah, tidak akan
mengirim pesan jika loop pesan nyata diketahui ada. Mengembalikan jumlah
pesan diambil.
Meninggal dengan "QUITing..." jika pesan WM_QUIT diperoleh.
"OS2::Process_Messages(paksa [, cnt])"
Pengambilan pesan PM hingga pembuatan/penghancuran jendela. Jika "kekuatan" salah, akan
tidak mengirimkan pesan jika loop pesan nyata diketahui ada.
Mengembalikan perubahan jumlah jendela. Jika "cnt" diberikan, itu bertambah dengan
jumlah pesan yang diambil.
Meninggal dengan "QUITing..." jika pesan WM_QUIT diperoleh.
"OS2::_control87(baru,topeng)"
sama seperti _kontrol87(3) dari EMX. Mengambil bilangan bulat sebagai argumen, mengembalikan yang sebelumnya
kata kontrol koprosesor sebagai bilangan bulat. Hanya bit dalam "baru" yang ada di
"topeng" diubah dalam kata kontrol.
OS2::get_control87()
mendapatkan kata kontrol koprosesor sebagai bilangan bulat.
"OS2::set_control87_em(baru=MCW_EM,mask=MCW_EM)"
Varian dari OS2::_kontrol87() dengan nilai default bagus untuk menangani topeng pengecualian:
jika tidak ada "topeng", gunakan pengecualian topeng bagian dari "baru" saja. Jika tidak ada "baru", nonaktifkan semua
pengecualian titik mengambang.
Lihat "Misfeatures" untuk detailnya.
"OS2::DLLname([bagaimana [, \&xsub]])"
Memberikan informasi tentang Perl DLL atau DLL yang berisi fungsi C terikat ke
oleh &xsub. Arti dari "how" adalah: default (2): nama lengkap; 0: menangani; 1: nama modul.
(Perhatikan bahwa beberapa di antaranya mungkin dipindahkan ke perpustakaan yang berbeda - akhirnya).
Bawaan variabel:
$OS2::emx_rev
nilai numerik sama dengan _emx_rev dari EMX, nilai string sama dengan _emx_vprt
(mirip dengan "0.9c").
$OS2::emx_env
sama dengan _emx_env dari EMX, angka yang mirip dengan 0x8001.
$OS2::os_ver
angka "OS_MAJOR + 0.001 * OS_MINOR".
$OS2::is_aout
benar jika perpustakaan Perl dikompilasi dalam format AOUT.
$OS2::can_fork
benar jika executable saat ini adalah executable AOUT EMX, sehingga Perl dapat melakukan fork. Tidak
gunakan ini, gunakan cek portabel untuk $Config::Config{dfork}.
$OS2::nsyserror
Variabel ini (default adalah 1) mengontrol apakah akan memaksakan konten $^E untuk memulai
dengan id seperti "SYS0003". Jika disetel ke 0, maka nilai string $^E adalah
tersedia dari file pesan OS/2. (Beberapa pesan dalam file ini memiliki
"SYS0003"-seperti id ditambahkan, beberapa tidak.)
kesalahan fitur
· Sejak kawanan(3) hadir di EMX, tetapi tidak berfungsi, itu ditiru oleh Perl. Ke
nonaktifkan emulasi, atur variabel lingkungan "USE_PERL_FLOCK=0".
· Berikut adalah daftar hal-hal yang mungkin "rusak" pada EMX (dari dokumen EMX):
· Fungsi pesan kembali(3) kirim pesan(3), dan pasangan soket(3) tidak dilaksanakan.
· kaus kaki_init(3) tidak diperlukan dan tidak dilaksanakan.
· kawanan(3) belum dilaksanakan (fungsi dummy). (Perl punya solusi.)
· membunuh(3): Perlakuan khusus PID=0, PID=1 dan PID=-1 tidak dilaksanakan.
· tunggu(3):
tidak terlacak
Tidak dilaksanakan.
waitpid() tidak diimplementasikan untuk nilai negatif PID.
Perhatikan bahwa "kill -9" tidak berfungsi dengan versi EMX saat ini.
· Lihat "Penanganan file mode teks".
· Soket domain-unix pada OS/2 hidup dalam sistem file-semu "/ soket/...". Untuk menghindari
kegagalan untuk membuat soket dengan nama bentuk yang berbeda, "/ soket/" ditambahkan ke
nama soket (kecuali jika sudah dimulai dengan ini).
Ini dapat menyebabkan masalah nanti jika soket diakses melalui file "biasa"-
panggilan sistem menggunakan nama "awal".
· Rupanya, IBM menggunakan compiler (untuk beberapa periode waktu sekitar '95?) yang mengubah FP
topeng kanan dan kiri. Ini bukan bahwa buruk untuk program IBM, tetapi kompiler yang sama
digunakan untuk DLL yang digunakan dengan aplikasi tujuan umum. Ketika DLL ini
digunakan, status flag floating-point dalam aplikasi tidak dapat diprediksi.
Yang jauh lebih buruk, beberapa DLL mengubah flag floating point saat masuk _DLInitTerm()
(misalnya, TCP32IP). Ini berarti bahwa bahkan jika Anda tidak panggilan fungsi apa pun di DLL,
hanya tindakan memuat DLL ini akan mengatur ulang bendera Anda. Yang lebih buruk, sama
compiler digunakan untuk mengkompilasi beberapa HOOK DLL. Mengingat bahwa HOOK dll dieksekusi di
konteks semua aplikasi dalam sistem, ini berarti ketidakpastian yang lengkap
flag floating point pada sistem yang menggunakan DLL HOOK tersebut. Misalnya, GAMESRVR.DLL of MENYELAM
origin mengubah flag floating point pada setiap penulisan ke TTY dari VIO (berjendela
aplikasi mode teks).
Beberapa situasi lain (tidak sepenuhnya di-debug) ketika flag FP berubah termasuk beberapa
driver video (?), dan beberapa operasi yang terkait dengan pembuatan windows. Orang yang
kode OpenGL mungkin memiliki lebih banyak pengalaman dalam hal ini.
Perl umumnya digunakan dalam situasi ketika semua pengecualian floating-point adalah
diabaikan, seperti default di bawah EMX. Jika mereka tidak diabaikan, beberapa Perl . yang ramah
program akan mendapatkan "SIGFPE" dan akan mati dengan mengerikan.
Untuk menghindari ini, Perl menggunakan dua peretasan. Mereka membantu melawan satu jenis kerusakan saja:
Bendera FP berubah saat memuat DLL.
Salah satu peretasan adalah menonaktifkan pengecualian floating point pada startup Perl (seperti halnya
default dengan EMX). Ini hanya membantu dengan DLL terkait waktu kompilasi yang mengubah flag
sebelum utama() memiliki kesempatan untuk dipanggil.
Retasan lainnya adalah mengembalikan flag FP setelah panggilan ke jatuh(). Ini membantu melawan
kerusakan serupa yang dilakukan oleh DLL _DLInitTerm() saat berjalan. Saat ini tidak ada cara untuk beralih
hacks off ini disediakan.
Modifikasi
Perl memodifikasi beberapa panggilan pustaka C standar dengan cara berikut:
"popen" "my_popen" menggunakan sh.exe jika shell diperlukan, lih. "PERL_SH_DIR".
"tmpnam" dibuat menggunakan variabel lingkungan "TMP" atau "TEMP", melalui "tempnam".
"tmpfile"
Jika direktori saat ini tidak dapat ditulis, file dibuat menggunakan modifikasi
"tmpnam", jadi mungkin ada kondisi balapan.
"ctermid"
implementasi boneka.
"stat" "os2_stat" kasus khusus /dev/tty dan /dev/kon.
"mkdir", "rmdir"
fungsi EMX ini tidak berfungsi jika jalur berisi "/". Perl
berisi solusi untuk ini.
"kawanan" Sejak kawanan(3) hadir di EMX, tetapi tidak berfungsi, itu ditiru oleh Perl.
Untuk menonaktifkan emulasi, setel variabel lingkungan "USE_PERL_FLOCK=0".
mengidentifikasi DLL
Semua DLL yang dibuat dengan versi Perl saat ini memiliki string ID yang mengidentifikasi namanya
ekstensi, versinya, dan versi Perl yang diperlukan untuk DLL ini. Lari
"bldlevel DLL-name" untuk menemukan info ini.
Sentralisasi pengelolaan of sumber daya
Karena untuk memanggil OS/2 API tertentu, seseorang harus memiliki subsistem "Menang" yang diinisialisasi dengan benar,
Ekstensi khusus OS/2 mungkin memerlukan "HAB" dan "HMQ". Jika ekstensi akan melakukannya
itu sendiri, ekstensi lain bisa gagal untuk menginisialisasi.
Perl menyediakan manajemen terpusat dari sumber daya ini:
"HAB"
Untuk mendapatkan HAB, ekstensi harus memanggil "hab = perl_hab_GET()" di C. Setelah ini
panggilan dilakukan, "hab" dapat diakses sebagai "Perl_hab". Tidak perlu melepaskan
HAB setelah digunakan.
Jika karena beberapa alasan perl.h tidak dapat disertakan, gunakan
extern int Perl_hab_GET(tidak berlaku);
sebagai gantinya.
"HMQ"
Ada dua kasus:
· ekstensi memerlukan "HMQ" hanya karena beberapa API tidak akan berfungsi sebaliknya. Menggunakan
"melayani = 0" di bawah.
· ekstensi membutuhkan "HMQ" karena ingin terlibat dalam loop acara PM. Menggunakan
"melayani = 1" di bawah.
Untuk mendapatkan "HMQ", ekstensi harus memanggil "hmq = perl_hmq_GET(serve)" di C. Setelah
panggilan ini dilakukan, "hmq" dapat diakses sebagai "Perl_hmq".
Untuk memberi sinyal kepada Perl bahwa HMQ tidak diperlukan lagi, panggil "perl_hmq_UNSET(serve)". Perl
proses akan secara otomatis berubah/tidak berubah menjadi/dari proses PM jika HMQ adalah
dibutuhkan/tidak dibutuhkan. Perl akan secara otomatis mengaktifkan/menonaktifkan pesan "WM_QUIT" selama
shutdown jika antrian pesan dilayani/tidak dilayani.
CATATAN. Jika selama shutdown ada antrian pesan yang tidak menonaktifkan WM_QUIT,
dan yang tidak memproses pesan WM_QUIT yang diterima, shutdown akan
otomatis dibatalkan. Jangan panggil perl_hmq_GET(1) kecuali Anda akan memproses
pesan secara teratur.
Mengobati kesalahan yang dilaporkan oleh OS/2 API
Ada dua konvensi utama (berguna untuk menyebutnya "Dos*" dan "Win*" -
meskipun bagian dari tanda tangan fungsi ini tidak selalu ditentukan oleh nama
API) pelaporan kondisi kesalahan OS/2 API. Sebagian besar API "Dos*" melaporkan
kode kesalahan sebagai hasil panggilan (jadi 0 berarti berhasil, dan ada banyak jenis
kesalahan). Sebagian besar laporan API "Menang*" berhasil/gagal melalui hasil "TRUE"/"FALSE";
untuk menemukan alasan kegagalan seseorang harus menelepon WinGetLastError() API.
Beberapa titik masuk "Menang*" juga membebani nilai pengembalian "bermakna" dengan kesalahan
indikator; memiliki nilai pengembalian 0 menunjukkan kesalahan. Namun beberapa entri "Menang*" lainnya
poin membebani lebih banyak lagi, dan nilai pengembalian 0 dapat berarti panggilan yang berhasil
mengembalikan nilai valid 0, serta kondisi kesalahan; dalam kasus pengembalian 0
nilai yang harus dipanggil WinGetLastError() API untuk membedakan panggilan yang berhasil dari a
gagal satu.
Menurut konvensi, semua panggilan ke OS/2 API harus menunjukkan kegagalannya dengan menyetel ulang
$^E. Semua fungsi yang dapat diakses Perl yang memanggil OS/2 API dapat dipecah menjadi dua
kelas: beberapa mati ()s ketika kesalahan API ditemukan, yang lain melaporkan kesalahan melalui
nilai pengembalian palsu (tentu saja, ini tidak menyangkut fungsi yang dapat diakses Perl yang
mengharapkan kegagalan panggilan API OS/2, memiliki beberapa kode solusi).
Jelas, dalam situasi jenis tanda tangan terakhir dari OS/2 API, itu adalah
harus lebih nyaman bagi pengguna jika kegagalan ditunjukkan oleh: mati ()ing: seseorang melakukannya
tidak perlu memeriksa $^E untuk mengetahui ada yang tidak beres. Namun, jika solusi ini
tidak diinginkan karena alasan tertentu, kode yang dimaksud harus mengatur ulang $^E ke 0 sebelumnya
membuat panggilan API OS/2 ini, sehingga pemanggil fungsi yang dapat diakses Perl ini memiliki
kesempatan untuk membedakan nilai sukses-tapi-0-kembali dari kegagalan. (Seseorang dapat kembali
undef sebagai cara alternatif untuk melaporkan kesalahan.)
Makro untuk menyederhanakan jenis propagasi kesalahan ini adalah
"CheckOSError(expr)"
Mengembalikan nilai true pada kesalahan, set $^E. Mengharapkan expr() menjadi panggilan API gaya "Dos*".
"CheckWinError(expr)"
Mengembalikan nilai true pada kesalahan, set $^E. Mengharapkan expr() menjadi panggilan API gaya "Menang*".
"SimpanWinError(expr)"
Mengembalikan "expr", set $^E dari WinGetLastError() jika "expr" salah.
"SaveCroakWinError(expr,die,name1,name2)"
Mengembalikan "expr", set $^E dari WinGetLastError() jika "expr" salah, dan mati ()jika
"mati" dan $^E benar. Pesan untuk mati adalah string gabungan "name1"
dan "name2", dipisahkan oleh ": " dari isi $^E.
"WinError_2_Perl_rc"
Setel "Perl_rc" ke nilai kembalian WinGetLastError().
"IsiWinError"
Setel "Perl_rc" ke nilai kembalian WinGetLastError(), dan set $^E ke
nilai yang sesuai.
"IsiOSError(rc)"
Setel "Perl_rc" ke "rc", dan setel $^E ke nilai yang sesuai.
Memuat DLL dan ordinal di DLL
Beberapa DLL hanya ada di beberapa versi OS/2, atau di beberapa konfigurasi
OS/2. Beberapa titik masuk yang diekspor hanya ada dalam DLL yang dikirimkan dengan beberapa versi
dari OS/2. Jika DLL dan titik masuk ini terhubung langsung untuk Perl
executable/DLL atau dari ekstensi Perl, biner ini hanya akan bekerja dengan
versi/pengaturan yang ditentukan. Bahkan jika titik masuk ini tidak diperlukan, memuat of
yang dapat dieksekusi (atau DLL) akan gagal.
Misalnya, banyak API berguna yang lebih baru tidak ada di OS/2 v2; banyak API terkait PM
memerlukan DLL yang tidak tersedia pada pengaturan floppy-boot.
Untuk membuat panggilan ini gagal hanya ketika itu panggilan adalah dieksekusi, orang harus memanggil API ini
melalui API penautan dinamis. Ada subsistem di Perl untuk menyederhanakan jenis
panggilan. Sejumlah besar titik masuk yang tersedia untuk penautan tersebut disediakan (lihat
"entries_ordinals" - dan juga "PMWIN_entries" - di os2ish.h). Ordinal ini dapat berupa
diakses melalui API:
PanggilanORD(), DeclFuncByORD(), DeclVoidFuncByORD(),
DeclOSFuncByORD(), DeclWinFuncByORD(), AssignFuncPByORD(),
TolakWinFuncByORD_CACHE(), TolakWinFuncByORD_CACHE_survive(),
TolakWinFuncByORD_CACHE_resetError_survive(),
TolakWinFunc_CACHE(), TolakWinFunc_CACHE_resetError(),
TolakWinFunc_CACHE_survive(), TolakWinFunc_CACHE_resetError_survive()
Lihat file header dan kode C di modul terkait OS/2 yang disertakan untuk
detail tentang penggunaan fungsi-fungsi ini.
Beberapa dari fungsi ini juga menggabungkan semantik dynaloading dengan propagasi kesalahan
semantik dibahas di atas.
Perl rasa
Karena keanehan OS/2 seseorang tidak dapat memiliki semua telur di keranjang yang sama (meskipun
Lingkungan EMX berusaha keras untuk mengatasi keterbatasan ini, jadi situasinya mungkin entah bagaimana
memperbaiki). Ada 4 executable untuk Perl yang disediakan oleh distribusi:
perl.exe
Pekerja keras utama. Ini adalah chimera yang dapat dieksekusi: ini dikompilasi sebagai gaya "a.out"
dapat dieksekusi, tetapi ditautkan dengan perpustakaan dinamis gaya "omf" perl.dll, dan dengan CRT dinamis
DLL. Eksekusi ini adalah aplikasi VIO.
Itu dapat memuat ekstensi dinamis Perl, dan itu bisa garpu().
Catatan. Perlu diingat bahwa garpu() diperlukan untuk membuka pipa untuk diri sendiri.
perl_.exe
Ini adalah gaya executable "a.out" yang terhubung secara statis. Itu tidak dapat memuat Perl dinamis
ekstensi. Eksekusi yang disediakan dalam distribusi biner memiliki banyak ekstensi
prebuilt, sehingga pembatasan di atas penting hanya jika Anda menggunakan ekstensi yang dibuat khusus.
Eksekusi ini adalah aplikasi VIO.
Kredensial mikro is itu hanya executable dengan tidak tidak membutuhkan OS/2. Teman-teman terkunci di dunia "M$"
akan menghargai fakta bahwa eksekusi ini berjalan di bawah DOS, Win0.3*, Win0.95 dan WinNT
dengan ekstender yang sesuai. Lihat "OS lainnya".
perl__exe
Ini adalah executable yang sama dengan perl___exe, tetapi ini adalah aplikasi PM.
Catatan. Biasanya (kecuali diarahkan secara eksplisit selama startup) STDIN, STDERR, dan STDOUT
dari aplikasi PM diarahkan ke batal. Namun, adalah mungkin untuk melihat mereka jika kamu
mulai "perl__.exe" dari program PM yang mengemulasi jendela konsol, seperti Kulit mode of
Emacs atau EPM. Jadi itu is mungkin untuk menggunakan debugger Perl (lihat perldebug) untuk men-debug PM Anda
aplikasi (tetapi waspadalah terhadap penguncian loop pesan - ini tidak akan berfungsi jika Anda memiliki
antrian pesan untuk dilayani, kecuali jika Anda menghubungkan penyajian ke dalam dapatkan() fungsi dari
debuger).
Cara lain untuk melihat output dari program PM adalah dengan menjalankannya sebagai
pm_prog argumen 2>&1 | kucing -
dengan cangkang berbeda dari cmd.exe, sehingga tidak membuat tautan antara VIO
sesi dan sesi "pm_porg". (Tautan seperti itu menutup jendela VIO.) Misalnya, ini
bekerja dengan sh.exe - atau dengan Perl!
buka P, 'pm_prog args 2>&1 |' atau mati;
cetak sambil ;
Rasa perl__exe diperlukan jika Anda ingin memulai program tanpa jendela VIO
ada, tetapi tidak "terlepas" (jalankan "bantuan lepas" untuk info lebih lanjut). Sangat berguna untuk ekstensi
yang menggunakan PM, seperti "Perl/Tk" atau "OpenGL".
Perhatikan juga bahwa perbedaan antara executable PM dan VIO hanya di kegagalan
perilaku. Seseorang dapat memulai Apa pun dapat dieksekusi di Apa pun jenis sesi dengan menggunakan argumen
"/fs", "/pm" atau "/win" beralih dari perintah "start" (dari CMD.EXE atau cangkang serupa).
Atau, seseorang dapat menggunakan argumen numerik pertama dari fungsi Perl "sistem" (lihat
OS2::Proses).
perl___exe
Ini adalah executable gaya "omf" yang terhubung secara dinamis ke perl.dll dan CRT DLL. saya
tahu tidak ada keuntungan dari eksekusi ini dibandingkan "perl.exe", tetapi tidak bisa garpu() sama sekali. Sehat,
satu keuntungannya adalah proses pembuatannya tidak terlalu berbelit-belit seperti dengan "perl.exe".
Ini adalah aplikasi VIO.
Mengapa aneh nama?
Karena Perl memproses baris "#!" (lih. "DESKRIPSI" di perlrun, "Sakelar Perintah" di
perlrun, "Tidak ada skrip Perl yang ditemukan di input" di perldiag), itu harus tahu kapan suatu program is a
Perl. Ada beberapa konvensi penamaan yang memungkinkan Perl membedakan garis yang benar dari
yang salah. Nama-nama di atas hampir merupakan satu-satunya nama yang diizinkan oleh konvensi ini yang melakukan
tidak mengandung angka (yang memiliki semantik yang sama sekali berbeda).
Mengapa dinamis menghubungkan?
Nah, memiliki beberapa executable yang ditautkan secara dinamis ke perpustakaan besar yang sama memilikinya
keuntungan, tetapi ini tidak akan mendukung pekerjaan tambahan untuk membuatnya dikompilasi. Itu
alasannya adalah rumit bagi pengembang tetapi sangat cepat dan nyaman bagi pengguna "sulit"
penautan dinamis yang digunakan oleh OS/2.
Ada dua fitur khas dari model dyna-linking OS/2: pertama, semua
referensi ke fungsi eksternal diselesaikan pada waktu kompilasi; kedua, tidak ada
perbaikan runtime dari DLL setelah mereka dimuat ke dalam memori. Fitur pertama adalah
keuntungan besar dibandingkan model lain: menghindari konflik ketika beberapa DLL digunakan oleh
entri ekspor aplikasi dengan nama yang sama. Dalam kasus seperti itu, model-model dinasti "lainnya"
menghubungkan cukup pilih di antara dua titik masuk ini menggunakan beberapa kriteria acak - dengan
bencana yang dapat diprediksi sebagai hasilnya. Tapi itu adalah fitur kedua yang membutuhkan build
of perl.dll.
Tabel alamat DLL hanya ditambal sekali, saat dimuat. Alamat dari
titik masuk ke DLL dijamin sama untuk semua program yang menggunakan
DLL yang sama. Ini menghapus perbaikan runtime - setelah DLL dimuat, kodenya hanya-baca.
Meskipun ini memungkinkan beberapa keuntungan kinerja (signifikan?), ini membuat hidup jauh lebih sulit
untuk pengembang, karena skema di atas tidak memungkinkan DLL untuk "ditautkan" ke a
simbol di EXE. mengajukan. Memang, ini akan membutuhkan DLL untuk memiliki relokasi yang berbeda
tabel untuk executable (berbeda) yang menggunakan DLL ini.
Namun, ekstensi Perl yang dimuat secara dinamis terpaksa menggunakan beberapa simbol dari perl
dapat dieksekusi, misalnya, untuk mengetahui cara menemukan argumen ke fungsi: argumen langsung
pada tumpukan evaluasi internal Perl. Solusinya adalah dengan meletakkan kode utama dari
penerjemah menjadi DLL, dan membuat EXE. file yang baru saja memuat DLL ini ke dalam memori dan
menyediakan argumen perintah. Ekstensi DLL tidak dapat ditautkan ke simbol di EXE., tetapi memiliki
tidak ada masalah menautkan ke simbol di DLL.
Kredensial mikro sangat meningkatkan waktu buka untuk aplikasi (serta kompleksitas
kompilasi). Karena interpreter dalam DLL, C RTL pada dasarnya dipaksa untuk berada di a
DLL juga (jika tidak, ekstensi tidak akan dapat menggunakan CRT). ada beberapa
keuntungan jika Anda menggunakan rasa perl yang berbeda, seperti berlari perl.exe dan perl__exe
secara bersamaan: mereka berbagi memori tentang perl.dll.
CATATAN. Ada satu efek tambahan yang membuat DLL lebih boros: DLL dimuat di
wilayah memori bersama, yang merupakan sumber daya langka mengingat penghalang 512M dari
memori virtual OS/2 "standar". Kode dari EXE. file juga dibagikan oleh semua
proses yang menggunakan tertentu EXE., tetapi mereka "dibagi dalam ruang alamat pribadi
proses"; ini dimungkinkan karena alamat di mana bagian yang berbeda dari
EXE. file yang dimuat diputuskan pada waktu kompilasi, sehingga semua proses memiliki ini
bagian dimuat di alamat yang sama, dan tidak ada perbaikan tautan internal di dalam EXE. is
dibutuhkan.
Karena DLL dapat dimuat pada saat dijalankan, untuk memiliki mekanisme yang sama untuk DLL, seseorang perlu:
memiliki kisaran alamat Apa pun of itu sarat DLL dalam sistem akan tersedia in semua itu
proses yang belum memuat DLL tertentu. Inilah sebabnya mengapa DLL dipetakan ke
wilayah memori bersama.
Mengapa Chimera membangun?
Lingkungan EMX saat ini tidak mengizinkan DLL yang dikompilasi menggunakan format "a.out" Unixish untuk
ekspor simbol untuk data (atau setidaknya beberapa jenis data). Ini memaksa kompilasi gaya "omf"
of perl.dll.
Lingkungan EMX saat ini tidak memungkinkan EXE. file yang dikompilasi dalam format "omf" ke garpu().
garpu() diperlukan untuk tepat tiga operasi Perl:
· eksplisit garpu() dalam naskah,
· "buka FH, "|-""
· "buka FH, "-|"", dengan kata lain, membuka pipa untuk dirinya sendiri.
Sementara operasi ini bukan masalah hidup dan mati, mereka dibutuhkan untuk banyak
skrip yang berguna. Ini memaksa kompilasi gaya "a.out" dari perl.exe.
LINGKUNGAN
Di sini kami mencantumkan variabel lingkungan dengan spesifik OS/2- dan DOS- dan Win*, atau
lebih penting di bawah OS/2 daripada di bawah OS lain.
"PERLLIB_PREFIX"
Khusus untuk port EMX. Harus memiliki bentuk
jalur1; jalur2
or
jalur1 jalur2
Jika awal dari beberapa jalur bawaan cocok jalan1, diganti dengan jalan2.
Harus digunakan jika perpustakaan Perl dipindahkan dari lokasi default ke
"PERL(5)LIB", karena ini tidak akan meninggalkan entri yang salah di @INC. Misalnya, jika
versi perl yang dikompilasi mencari @INC di f:/perllib/lib, dan Anda ingin menginstal
perpustakaan di jam:/opt/gnuDari
atur PERLLIB_PREFIX=f:/perllib/lib;h:/opt/gnu
Ini akan menyebabkan Perl dengan @INC bawaan dari
f:/perllib/lib/5.00553/os2
f:/perllib/lib/5.00553
f:/perllib/lib/site_perl/5.00553/os2
f:/perllib/lib/site_perl/5.00553
.
untuk menggunakan @INC berikut:
j:/opt/gnu/5.00553/os2
j:/opt/gnu/5.00553
jam:/opt/gnu/site_perl/5.00553/os2
jam:/opt/gnu/site_perl/5.00553
.
"PERL_BADLANG"
Jika 0, perl mengabaikan setlokal() kegagalan. Semoga bermanfaat dengan beberapa yang aneh Lokals.
"PERL_BADFREE"
Jika 0, Perl tidak akan memperingatkan jika tidak beralasan Gratis(). Dengan perls yang lebih tua, ini mungkin
berguna dalam hubungannya dengan modul DB_File, yang bermasalah saat ditautkan secara dinamis dan
dibangun oleh OMF.
Tidak boleh disetel dengan Perls yang lebih baru, karena ini mungkin menyembunyikan beberapa nyata masalah.
"PERL_SH_DIR"
Khusus untuk port EMX. Memberikan bagian direktori dari lokasi untuk sh.exe.
"USE_PERL_FLOCK"
Khusus untuk port EMX. Sejak kawanan(3) hadir di EMX, tetapi tidak berfungsi, itu adalah
ditiru oleh perl. Untuk menonaktifkan emulasi, setel variabel lingkungan "USE_PERL_FLOCK=0".
"TMP" or "TEMP"
Khusus untuk port EMX. Digunakan sebagai tempat penyimpanan untuk file-file sementara.
evolusi
Di sini kami mencantumkan perubahan besar yang dapat membuat Anda terkejut.
Mode teks pegangan file
Mulai dari versi 5.8, Perl menggunakan lapisan terjemahan bawaan untuk file mode teks.
Ini menggantikan lapisan EMX yang teruji dengan baik dengan beberapa kode yang seharusnya menjadi yang terbaik
ditandai sebagai "retas cepat".
Selain kemungkinan bug dan ketidakmampuan untuk mengikuti perubahan pada kebijakan terjemahan
dengan sakelar mati/hidup terjemahan TERMIO, ini memperkenalkan perubahan serius yang tidak kompatibel:
sebelum sysread() pada penanganan file mode teks akan melalui lapisan terjemahan, sekarang
tidak akan.
Prioritas
"setpriority" dan "getpriority" tidak kompatibel dengan port sebelumnya oleh Andreas Kaiser.
Lihat "setprioritas, dapatkanprioritas".
DLL nama mengoceh: pra 5.6.2
Dengan rilis 5.003_01 perpustakaan yang dapat dimuat secara dinamis harus dibangun kembali ketika a
versi Perl yang berbeda dikompilasi. Secara khusus, DLL (termasuk perl.dll) sekarang
dibuat dengan nama yang berisi checksum, sehingga memungkinkan solusi untuk skema OS/2
dari cache DLL.
Dimungkinkan untuk membuat kode solusi sederhana yang akan
· temukan DLL lama melihat melalui @INC lama;
· pisahkan nama sesuai dengan skema perl baru dan salin DLL ke nama-nama ini;
· edit tabel "LX" internal DLL untuk mencerminkan perubahan nama (mungkin tidak
diperlukan untuk DLL ekstensi Perl, karena nama kode internal tidak digunakan untuk
DLL "spesifik", mereka hanya digunakan untuk DLL "global").
· edit tabel "IMPOR" internal dan ubah nama "lama" perl????.dll ke
"baru" perl????.dll.
DLL nama mengoceh: 5.6.2 dan Luar
Bahkan mangling dari perpanjangan DLL dilakukan karena kesalahpahaman tentang OS/2
model dynaload. OS/2 (secara efektif) memelihara dua tabel berbeda dari DLL yang dimuat:
DLL global
yang dimuat dengan nama dasar dari "LIBPATH"; termasuk yang terkait pada waktu tautan;
DLL tertentu
dimuat dengan nama lengkap.
Saat menyelesaikan permintaan untuk DLL global, tabel DLL spesifik yang sudah dimuat adalah:
(efektif) diabaikan; selain itu, DLL tertentu adalah selalu dimuat dari jalur yang ditentukan.
Ada/ada sedikit perubahan yang membuat skema ini rapuh: apa yang harus dilakukan dengan memuat DLL
dari
"BEGINLIBPATH" dan "ENDLIBPATH"
(yang tergantung pada proses)
. dari "LIBPATH"
yang efektif tergantung pada prosesnya (walaupun "LIBPATH" sama untuk semua
proses).
Kecuali "LIBPATHSTRICT" disetel ke "T" (dan kernelnya setelah 2000/09/01), DLL tersebut
dianggap mendunia. Saat memuat DLL global, itu pertama kali terlihat di tabel
DLL global yang sudah dimuat. Karena fakta bahwa satu executable memuat DLL
dari "BEGINLIBPATH" dan "ENDLIBPATH", atau . dari "LIBPATH" dapat mempengaruhi yang DLL dimuat
ketika lain executable meminta DLL dengan nama yang sama. Kredensial mikro adalah alasannya
mangling versi khusus dari nama DLL untuk Perl DLL.
Karena DLL ekstensi Perl selalu dimuat dengan path lengkap, tidak perlu untuk
pisahkan nama mereka dengan cara khusus versi: direktori mereka sudah mencerminkan
versi perl yang sesuai, dan @INC memperhitungkan kompatibilitas biner dengan yang lebih lama
Versi: kapan. Mulai dari 5.6.2 nama skema mangling diperbaiki agar sama dengan Perl
5.005_53 (sama seperti dalam rilis biner populer). Dengan demikian Perls baru akan dapat menyelesaikan
itu nama dari DLL ekstensi lama jika @INC memungkinkan menemukan direktori mereka.
Namun, ini masih tidak menjamin bahwa DLL ini dapat dimuat. Alasannya adalah
mangling nama Perl DLL. Dan karena ekstensi DLL terhubung dengan Perl
DLL, ekstensi DLL untuk versi yang lebih lama akan memuat Perl DLL yang lebih lama, dan akan sebagian besar
mungkin segfault (karena data dalam DLL ini tidak diinisialisasi dengan benar).
Ada solusi parsial (yang dapat dibuat lengkap dengan kernel OS/2 yang lebih baru): create
DLL forwarder dengan nama yang sama dengan DLL versi Perl yang lebih lama, yang meneruskan
entri menunjuk ke DLL Perl yang lebih baru. Jadikan DLL ini dapat diakses di (katakanlah) pada
"BEGINLIBPATH" dari Perl baru yang dapat dieksekusi. Ketika executable baru mengakses Perl lama
ekstensi DLL, mereka akan meminta DLL Perl lama dengan nama, dapatkan forwarder sebagai gantinya,
jadi secara efektif akan terhubung dengan Perl DLL yang sedang berjalan (baru).
Ini dapat pecah dalam dua cara:
· Perl executable lama dimulai ketika executable baru sedang berjalan telah dimuat dan
ekstensi dikompilasi untuk executable lama (ouph!). Dalam hal ini executable lama
akan mendapatkan DLL forwarder alih-alih DLL Perl lama, jadi akan menautkan dengan perl baru
DLL. Meskipun tidak secara langsung berakibat fatal, itu akan berperilaku sama dengan executable baru. Ini mengalahkan
seluruh tujuan secara eksplisit memulai executable lama.
· Eksekusi baru memuat ekstensi yang dikompilasi untuk eksekutabel lama ketika perl . lama
yang dapat dieksekusi sedang berjalan. Dalam hal ini ekstensi tidak akan mengambil forwarder -
dengan hasil yang fatal.
Dengan dukungan untuk "LIBPATHSTRICT" ini dapat dielakkan - kecuali salah satu DLL dimulai
dari . dari "LIBPATH" (Saya tidak tahu apakah "LIBPATHSTRICT" mempengaruhi kasus ini).
UCAPAN. Kecuali kernel yang lebih baru mengizinkan . di "BEGINLIBPATH" (lebih tua tidak), kekacauan ini tidak bisa
dibersihkan sepenuhnya. (Ternyata pada awal tahun 2002, . tidak diizinkan,
tapi . \. adalah - dan memiliki efek yang sama.)
UCAPAN. "LIBPATHSTRICT", "BEGINLIBPATH" dan "ENDLIBPATH" bukan variabel lingkungan,
meskipun cmd.exe mengemulasi mereka pada baris "SET ...". Dari Perl mereka dapat diakses oleh
Cwd::extLibpath dan Cwd::extLibpath_set.
DLL ekspeditur generasi
Asumsikan bahwa DLL lama bernama perlE0AC.dll (seperti satu untuk 5.005_53), dan yang baru
versi adalah 5.6.1. Buat file perl5shim.def-pemimpin dengan
TERMINSTANCE AWAL LIBRARY 'perlE0AC'
KETERANGAN '@#[email dilindungi]:5.006001#@ Modul Perl untuk 5.00553 -> Perl 5.6.1 forwarder'
KODE LOADONCALL
DATA LOADONCALL TIDAK DIBAGIKAN GANDA
EKSPOR
memodifikasi versi/nama sesuai kebutuhan. Lari
perl -wnle "berikutnya jika 0../EKSPOR/; print qq( \"$1\") jika /\"(\w+)\"/" perl5.def >lst
di direktori build Perl (untuk membuat DLL lebih kecil, ganti perl5.def dengan definisi
file untuk versi Perl yang lebih lama jika ada).
cat perl5shim.def-leader lst >perl5shim.def
gcc -Zomf -Zdll -o perlE0AC.dll perl5shim.def -s -llibperl
(abaikan beberapa "peringatan L4085").
threading
Pada rilis 5.003_01 perl ditautkan ke multithreaded C RTL DLL. Jika perl itu sendiri tidak
dikompilasi dengan multithread-enabled, jadi tidak akan menjadi milik Perl malloc (). Namun, ekstensi dapat menggunakan
beberapa utas dengan risiko mereka sendiri.
Ini diperlukan untuk mengkompilasi "Perl/Tk" untuk XFree86-OS/2 out-of-the-box, dan link dengan DLL
untuk pustaka berguna lainnya, yang biasanya dikompilasi dengan "-Zmt -Zcrtdll".
Panggilan untuk luar program
Karena permintaan yang populer, panggilan program eksternal Perl telah diubah dengan Andreas
pelabuhan Kaiser. If Perl perlu memanggil program eksternal melalui tempurung, yang f:/bin/sh.exe
akan dipanggil, atau apa pun yang ditimpa, lihat "PERL_SH_DIR".
Jadi berarti Anda perlu mendapatkan beberapa salinan a sh.exe juga (saya menggunakan satu dari pdksh). Itu
path F:/tempat sampah di atas diatur secara otomatis selama build ke nilai yang benar pada
mesin pembuat, tetapi dapat ditimpa saat runtime,
Alasan: konsensus tentang "perl5-porter" adalah bahwa Perl harus menggunakan satu shell yang tidak dapat ditimpa
per platform. Pilihan yang jelas untuk OS/2 adalah cmd.exe dan sh.exe. Memiliki perl build
itu sendiri tidak mungkin dengan cmd.exe sebagai Shell, jadi saya mengambil "sh.exe". Ini
menjamin kompatibilitas hampir 100% dengan skrip yang berasal dari *nix. Sebagai manfaat tambahan
ini bekerja dengan baik di bawah DOS jika Anda menggunakan port pdksh yang mendukung DOS (lihat "Prasyarat").
kekurangan: sekarang sh.exe dari pdksh memanggil program eksternal melalui garpu()/exec (), dan
ada tidak berfungsi exec () pada OS/2. exec () ditiru oleh EMX oleh panggilan asinkron
sementara penelepon menunggu penyelesaian anak (berpura-pura bahwa "pid" tidak berubah).
Artinya 1 tambahan salinan dari sh.exe diaktifkan melalui garpu()/exec (), yang dapat menyebabkan
beberapa sumber daya yang diambil dari sistem (bahkan jika kita tidak menghitung kerja ekstra yang diperlukan untuk
garpu()ing).
Perhatikan bahwa ini masalah yang lebih kecil sekarang ketika kami tidak menelurkan sh.exe kecuali diperlukan (metachars
ditemukan).
Seseorang selalu bisa memulai cmd.exe secara eksplisit melalui
sistem 'cmd', '/c', 'mycmd', 'arg1', 'arg2', ...
Jika Anda perlu menggunakan cmd.exe, dan tidak ingin mengedit ribuan skrip Anda, the
solusi jangka panjang yang diusulkan pada p5-p adalah memiliki arahan
gunakan OS2::Cmd;
yang akan menimpa sistem(), exec (), "``", dan "buka(,'...|')". Dengan Perl saat ini, Anda dapat
menimpa saja sistem(), pipa baca() - versi eksplisit dari "``", dan mungkin exec (). itu
kode akan menggantikan panggilan satu argumen ke sistem() oleh "CORE::system('cmd.exe', '/c',
menggeser)".
Jika Anda memiliki beberapa kode yang berfungsi untuk "OS2::Cmd", kirimkan kepada saya, saya akan memasukkannya ke dalam
distribusi. Saya tidak membutuhkan modul seperti itu, jadi tidak dapat mengujinya.
Untuk detail situasi saat ini dengan memanggil program eksternal, lihat "Memulai
Program OS/2 (dan DOS) di bawah Perl". Sebut kami beberapa fitur:
· Skrip eksternal dapat dipanggil dengan nama dasarnya. Perl akan mencoba ekstensi yang sama
seperti saat memproses -S saklar baris perintah.
· Skrip eksternal dimulai dengan "#!" atau "extproc" akan dieksekusi secara langsung, tanpa
memanggil shell, dengan memanggil program yang ditentukan pada sisa baris pertama.
Memori alokasi
Perl menggunakan miliknya sendiri malloc () di bawah OS/2 - penerjemah biasanya terikat malloc untuk kecepatan,
tetapi Perl tidak, karena malloc-nya sangat cepat. Tolok ukur yang disesuaikan dengan penggunaan memori-perl
menunjukkan bahwa malloc Perl adalah 5 kali lebih cepat dari satu EMX. Saya tidak memiliki data yang meyakinkan
tentang jejak memori, tetapi tolok ukur (cukup acak) menunjukkan bahwa Perl adalah 5%
lebih baik.
Kombinasi perl's malloc () dan resolusi nama DLL yang kaku menciptakan masalah khusus
dengan fungsi perpustakaan yang mengharapkan nilai pengembaliannya menjadi Gratis()d menurut sistem Gratis().
Untuk memfasilitasi ekstensi yang perlu memanggil fungsi seperti itu, alokasi memori sistem
fungsi masih tersedia dengan awalan "emx_" ditambahkan. (Saat ini hanya DLL Perl yang memiliki
ini, itu harus menyebar ke perl_.exe segera.)
Thread
Seseorang dapat membangun Perl dengan dukungan utas diaktifkan dengan menyediakan opsi "-D usethreads" untuk
Konfigurasi. Saat ini dukungan OS/2 untuk thread masih sangat awal.
Masalah yang paling menonjol:
"COND_WAIT"
mungkin memiliki kondisi balapan (tetapi mungkin tidak karena sifat OS/2 . yang dipicu oleh tepi)
semafor acara). (Perlu implementasi ulang (dalam hal merantai utas tunggu,
dengan daftar tertaut yang disimpan dalam struktur per-utas?)?)
os2.c
memiliki beberapa variabel statis yang digunakan dalam fungsi khusus OS/2. (Perlu dipindahkan
ke struktur per-utas, atau serial?)
Perhatikan bahwa masalah ini seharusnya tidak menghalangi eksperimen, karena memiliki yang rendah
kemungkinan mempengaruhi program kecil.
Gunakan perlos2 online menggunakan layanan onworks.net