Ini adalah perintah awkposix 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
awk — pemindaian pola dan bahasa pemrosesan
RINGKASAN
Wow [F sepstring] [v tugas]... program [argumen...]
Wow [F sepstring] f profil [f profil]... [v tugas]...
[argumen...]
DESKRIPSI
The Wow utilitas akan menjalankan program yang ditulis dalam Wow bahasa pemrograman, yaitu
khusus untuk manipulasi data tekstual. Sebuah Wow program adalah urutan pola dan
tindakan yang sesuai. Saat input dibaca yang cocok dengan suatu pola, tindakan terkait
dengan pola itu dilakukan.
Masukan harus ditafsirkan sebagai urutan catatan. Secara default, catatan adalah garis, kurang
itu berakhir , tetapi ini dapat diubah dengan menggunakan RS variabel bawaan. Setiap
catatan input harus dicocokkan secara bergantian dengan setiap pola dalam program. Untuk setiap
pola cocok, tindakan terkait harus dieksekusi.
The Wow utilitas harus menafsirkan setiap catatan input sebagai urutan bidang di mana, dengan
default, bidang adalah string non- non- karakter. default ini
dan pembatas bidang dapat diubah dengan menggunakan FS variabel bawaan atau F
sepstring pilihan. Itu Wow utilitas akan menunjukkan bidang pertama dalam catatan $1, yang kedua
$2, dan seterusnya. Simbol $0 akan merujuk ke seluruh catatan; mengatur bidang lain
menyebabkan evaluasi ulang $0. Menetapkan ke $0 akan mengatur ulang nilai semua bidang lainnya
dan NF variabel bawaan.
PILIHAN
The Wow utilitas harus sesuai dengan volume Definisi Dasar POSIX.1-2008, Bagian
12.2, Kegunaan Sintaksis Panduan.
Opsi berikut harus didukung:
F sepstring
Tentukan pemisah bidang input. Opsi ini setara dengan:
-v FS =sepstring
kecuali jika F sepstring dan v FS =sepstring keduanya digunakan, itu tidak ditentukan
apakah FS tugas yang dihasilkan dari F sepstring diproses dalam perintah
pesanan baris atau diproses setelah yang terakhir v FS =sepstring. Lihat deskripsi
dari FS variabel bawaan, dan cara penggunaannya, dalam DESKRIPSI TAMBAHAN
bagian.
f profil
Tentukan nama path file profil mengandung sebuah Wow program. Sebuah nama jalan
of '−' akan menunjukkan input standar. Jika beberapa contoh opsi ini adalah
ditentukan, rangkaian file yang ditentukan sebagai profil dalam urutan
ditentukan adalah Wow program. Itu Wow program alternatif dapat menjadi
ditentukan dalam baris perintah sebagai argumen tunggal.
v tugas
Aplikasi harus memastikan bahwa: tugas argumen dalam bentuk yang sama dengan
an tugas operan. Penetapan variabel yang ditentukan harus terjadi sebelum
mengeksekusi Wow program, termasuk tindakan yang terkait dengan MULAI pola
(jika ada). Beberapa kemunculan opsi ini dapat ditentukan.
OPERA
Operand berikut harus didukung:
program Jika tidak f opsi ditentukan, operan pertama ke Wow akan menjadi teks dari
Wow program. Aplikasi harus menyediakan: program operan sebagai tunggal
argumen untuk Wow. Jika teks tidak diakhiri dengan , Wow akan menafsirkan
teks seolah-olah itu.
argumen Salah satu dari dua jenis berikut argumen dapat dicampur:
fillet Nama path dari file yang berisi input untuk dibaca, yaitu
dicocokkan dengan set pola dalam program. Jika tidak fillet
operand ditentukan, atau jika a fillet operan adalah '−', Standar
masukan harus digunakan.
tugas
Sebuah operan yang dimulai dengan atau karakter alfabet
dari set karakter portabel (lihat tabel di Definisi Dasar
volume POSIX.1-2008, Bagian 6.1, Portabel Karakter set), diikuti
dengan urutan garis bawah, angka, dan alfabet dari
set karakter portabel, diikuti oleh '=' karakter, harus menentukan a
penugasan variabel daripada nama path. Karakter sebelum
'=' mewakili nama an Wow variabel; jika nama itu adalah Wow
kata yang dicadangkan (lihat Tatabahasa) perilaku tidak terdefinisi. karakter
mengikuti akan ditafsirkan seolah-olah mereka muncul
dalam Wow program didahului dan diikuti oleh tanda kutip ganda ('"')
karakter, sebagai STRING tanda (lihat Tatabahasa), kecuali jika yang terakhir
karakter adalah tak terelakkan , itu harus ditafsirkan sebagai
harfiah bukan sebagai karakter pertama dari urutan
"\"". Variabel harus diberi nilai itu STRING token
dan, jika sesuai, akan dianggap sebagai numerik string (Lihat
Ekspresi in Wow), variabel juga harus diberi nilai numeriknya
nilai. Setiap penetapan variabel tersebut harus terjadi sesaat sebelum
pengolahan berikut fillet, jika ada. Jadi, tugas sebelumnya
yang pertama fillet argumen akan dieksekusi setelah MULAI tindakan (jika
any), sementara tugas setelah yang terakhir fillet argumen akan terjadi
sebelum AKHIR tindakan (jika ada). Jika tidak ada fillet argumen,
penugasan harus dieksekusi sebelum memproses input standar.
STDIN
Input standar harus digunakan hanya jika tidak ada fillet operand ditentukan, atau jika a fillet
operan adalah '−', atau jika profil opsi-argumen adalah '−'; lihat bagian INPUT FILES. Jika
itu Wow program tidak mengandung tindakan dan tidak ada pola, tetapi sebaliknya valid Wow program
masukan standar dan apapun fillet operan tidak boleh dibaca dan Wow akan keluar dengan pengembalian
status nol.
INPUT FILE
Masukkan file ke Wow program dari salah satu sumber berikut harus berupa file teks:
* Setiap fillet operand atau yang setara, dicapai dengan memodifikasi Wow variabel ARGV
dan ARGC
* Input standar jika tidak ada fillet operan
* Argumen untuk getline fungsi
Apakah variabel RS diatur ke nilai selain a atau tidak, untuk file-file ini,
implementasi harus mendukung catatan yang diakhiri dengan pemisah yang ditentukan hingga
{LINE_MAX} byte dan mungkin mendukung catatan yang lebih panjang.
If f profil ditentukan, aplikasi harus memastikan bahwa file yang dinamai oleh masing-masing
itu profil opsi-argumen adalah file teks dan rangkaiannya, dalam urutan yang sama seperti
mereka muncul dalam argumen, adalah Wow program.
LINGKUNGAN VARIABEL
Variabel lingkungan berikut akan mempengaruhi pelaksanaan Wow:
BAHASA Berikan nilai default untuk variabel internasionalisasi yang tidak disetel atau
batal. (Lihat volume Definisi Dasar dari POSIX.1-2008, Bagian 8.2,
Internasionalisasi Variabel untuk didahulukan internasionalisasi
variabel yang digunakan untuk menentukan nilai kategori lokal.)
LC_SEMUA Jika disetel ke nilai string yang tidak kosong, timpa nilai dari yang lainnya
variabel internasionalisasi.
LC_COLLATE
Tentukan lokal untuk perilaku rentang, kelas kesetaraan, dan multi-
elemen menyusun karakter dalam ekspresi reguler dan dalam perbandingan
nilai string.
LC_CTYPE Tentukan lokal untuk interpretasi urutan byte data teks
sebagai karakter (misalnya, byte tunggal sebagai lawan dari karakter multi-byte dalam
argumen dan file input), perilaku kelas karakter dalam reguler
ekspresi, identifikasi karakter sebagai huruf, dan pemetaan
karakter huruf besar dan kecil untuk puncak dan lebih rendah fungsi.
LC_MESSAGES
Tentukan lokal yang harus digunakan untuk mempengaruhi format dan isi dari
pesan diagnostik yang ditulis ke kesalahan standar.
LC_NUMERIC
Tentukan karakter radix yang digunakan saat menafsirkan input numerik, melakukan
konversi antara nilai numerik dan string, dan memformat output numerik.
Terlepas dari lokal, karakter (karakter titik desimal dari
POSIX locale) adalah karakter titik desimal yang dikenali dalam pemrosesan Wow
program (termasuk tugas dalam argumen baris perintah).
NLSPATH Tentukan lokasi katalog pesan untuk pemrosesan LC_MESSAGES.
PATH Tentukan jalur pencarian saat mencari perintah yang dijalankan oleh sistem(cepat), atau
pipa input dan output; lihat volume Definisi Dasar dari POSIX.1-2008, Bab
8, Lingkungan Hidup Variabel.
Selain itu, semua variabel lingkungan harus terlihat melalui Wow variabel MENGEPUNG.
tidak sinkron EVENT
Default
STDOUT
Sifat file keluaran tergantung pada: Wow program.
STDERR
Kesalahan standar harus digunakan hanya untuk pesan diagnostik.
KELUARAN FILE
Sifat file keluaran tergantung pada: Wow program.
DITERIMA DESKRIPSI
Secara keseluruhan program Structure
An Wow Program ini terdiri dari pasangan bentuk:
belt hold { tindakan }
Baik pola atau tindakan (termasuk karakter kurung kurawal) dapat berupa
dihilangkan.
Pola yang hilang harus cocok dengan catatan input apa pun, dan tindakan yang hilang harus:
setara dengan:
{ mencetak }
Eksekusi dari Wow program harus dimulai dengan terlebih dahulu menjalankan tindakan yang terkait dengan
semua MULAI pola dalam urutan mereka terjadi dalam program. Kemudian masing-masing fillet operan (atau
input standar jika tidak ada file yang ditentukan) harus diproses secara bergantian dengan membaca data dari
file sampai pemisah catatan terlihat ( secara default). Sebelum yang pertama
referensi ke bidang dalam catatan dievaluasi, catatan harus dibagi menjadi beberapa bidang,
sesuai aturan di Reguler Ekspresi, dengan menggunakan nilai FS itu saat ini di
waktu catatan itu dibaca. Setiap pola dalam program kemudian dievaluasi dalam
urutan kejadian, dan tindakan yang terkait dengan setiap pola yang cocok dengan arus
catatan dieksekusi. Tindakan untuk pola yang cocok harus dilakukan sebelum mengevaluasi
pola-pola selanjutnya. Akhirnya, tindakan yang terkait dengan semua AKHIR pola harus
dieksekusi sesuai urutan kemunculannya dalam program.
Ekspresi in Wow
Ekspresi menggambarkan perhitungan yang digunakan dalam pola dan tindakan. Pada tabel berikut,
operasi ekspresi yang valid diberikan dalam kelompok dari prioritas tertinggi pertama hingga terendah
didahulukan terakhir, dengan operator dengan prioritas yang sama dikelompokkan di antara garis horizontal. Di
evaluasi ekspresi, di mana tata bahasanya secara formal ambigu, prioritas yang lebih tinggi
operator harus dievaluasi sebelum operator dengan prioritas lebih rendah. Dalam tabel ini cepat, expr1,
expr2, dan expr3 mewakili ekspresi apa pun, sedangkan lvalue mewakili entitas apa pun yang dapat
ditugaskan ke (yaitu, di sisi kiri operator penugasan). Sintaks yang tepat dari
ekspresi diberikan dalam Tatabahasa.
tabel 4-1: Ekspresi in Penurunan Hak lebih tinggi in Wow
┌─────────────────────┬─────────────────────────┬─ ───────────────┬──────────────┐
│ Sintaksis │ Nama │ Tipe of Hasil │Asosiatif │
├─────────────────────┼─────────────────────────┼─ ───────────────┼──────────────┤
( cepat ) Pengelompokan Jenis cepat T/A
├─────────────────────┼─────────────────────────┼─ ───────────────┼──────────────┤
$cepat Referensi bidang String N/A
├─────────────────────┼─────────────────────────┼─ ───────────────┼──────────────┤
lvalue ++ Post-increment Numerik N/A
nilai Post-pengurangan Numerik N/A
├─────────────────────┼─────────────────────────┼─ ───────────────┼──────────────┤
++ nilai Pra-kenaikan Numerik N/A
nilai Pra-penurunan Numerik N/A
├─────────────────────┼─────────────────────────┼─ ───────────────┼──────────────┤
│cepat ^ cepat Eksponensial Numerik Kanan
├─────────────────────┼─────────────────────────┼─ ───────────────┼──────────────┤
! cepat Logis bukan Numerik N/A
+ cepat Unary plus Numerik N/A
│- cepat Unary dikurangi Numerik N/A
├─────────────────────┼─────────────────────────┼─ ───────────────┼──────────────┤
│cepat * cepat Perkalian Numerik Kiri
│cepat / cepat Divisi Numerik Kiri
│cepat % cepat Modulus Numerik Kiri
├─────────────────────┼─────────────────────────┼─ ───────────────┼──────────────┤
│cepat + cepat Penambahan Numerik Kiri
│cepat - cepat Pengurangan Numerik Kiri
├─────────────────────┼─────────────────────────┼─ ───────────────┼──────────────┤
│cepat cepat Penggabungan string String Kiri
├─────────────────────┼─────────────────────────┼─ ───────────────┼──────────────┤
│cepat < cepat Kurang dari Numerik Tidak ada
│cepat <= cepat Kurang dari atau sama dengan Numerik Tidak ada
│cepat != cepat Tidak sama dengan Numerik Tidak ada
│cepat == cepat Sama dengan Numerik Tidak ada
│cepat > cepat Lebih besar dari Numerik Tidak ada
│cepat >= cepat Lebih besar dari atau sama dengan Numerik Tidak ada
├─────────────────────┼─────────────────────────┼─ ───────────────┼──────────────┤
│cepat ~ cepat ERE cocok Numerik Tidak ada
│cepat !~ cepat ERE non-pertandingan Numerik Tidak ada
├─────────────────────┼─────────────────────────┼─ ───────────────┼──────────────┤
│cepat dalam array Keanggotaan array Numerik Kiri
( indeks ) di susunan Array multi-dimensi Numerik Kiri
keanggotaan
├─────────────────────┼─────────────────────────┼─ ───────────────┼──────────────┤
│cepat && cepat Logis DAN Numerik Kiri
├─────────────────────┼─────────────────────────┼─ ───────────────┼──────────────┤
│cepat || cepat Logis ATAU Numerik Kiri
├─────────────────────┼─────────────────────────┼─ ───────────────┼──────────────┤
│expr1 ? expr2 : expr3Ekspresi bersyarat Jenis yang dipilih│Kanan
│ │ │.expr2 or expr3 │ │.
├─────────────────────┼─────────────────────────┼─ ───────────────┼──────────────┤
nilai ^= cepat Tugas eksponensial│Numerik Kanan
nilai %= cepat Penugasan modulus Numerik Kanan
nilai *= cepat Tugas perkalian│Numerik Kanan
nilai /= cepat Tugas divisi Numerik Kanan
nilai += cepat Tugas tambahan Numerik Kanan
nilai = cepat Tugas pengurangan Numerik Kanan
nilai = cepat Tugas Jenis cepat Benar
└─────────────────────┴─────────────────────────┴─ ───────────────┴──────────────┘
Setiap ekspresi harus memiliki nilai string, nilai numerik, atau keduanya. Kecuali sebagai
dinyatakan untuk konteks tertentu, nilai ekspresi harus secara implisit dikonversi ke
jenis yang dibutuhkan untuk konteks di mana ia digunakan. Nilai string harus dikonversi ke
nilai numerik baik dengan setara dengan panggilan berikut ke fungsi yang didefinisikan oleh
standar ISO C:
setlokal(LC_NUMERIC, "");
nilai angka = atof(string_nilai);
atau dengan mengubah bagian awal string menjadi type dua kali lipat representasi sebagai
berikut:
String input didekomposisi menjadi dua bagian: urutan awal, mungkin kosong
karakter spasi putih (seperti yang ditentukan oleh isspace()) dan urutan subjek
diinterpretasikan sebagai konstanta floating-point.
Bentuk yang diharapkan dari urutan subjek adalah opsional '+' or '−' tanda tangani, maka a
urutan digit yang tidak kosong secara opsional mengandung a , lalu opsional
bagian eksponen. Bagian eksponen terdiri dari 'e' or 'E', diikuti oleh opsional
tanda, diikuti oleh satu atau lebih angka desimal.
Urutan yang dimulai dengan angka pertama atau (mana yang lebih dulu terjadi)
ditafsirkan sebagai konstanta mengambang dari bahasa C, dan jika bukan eksponen
bagian atau muncul, diasumsikan mengikuti digit terakhir dalam
rangkaian. Jika urutan subjek dimulai dengan tanda minus, nilai yang dihasilkan dari
konversi dinegasikan.
Nilai numerik yang persis sama dengan nilai bilangan bulat (lihat Bagian 1.1.2,
Konsep Berasal dari itu ISO C Standar) harus dikonversi ke string dengan persamaan
dari panggilan ke lari cepat fungsi (lihat String Fungsi) dengan tali "%D" sebagai fmt
argumen dan nilai numerik yang dikonversi sebagai yang pertama dan satu-satunya cepat argumen. Setiap
nilai numerik lainnya harus dikonversi ke string dengan setara dengan panggilan ke
lari cepat fungsi dengan nilai variabel KONVFMT sebagai fmt argumen dan
nilai numerik yang dikonversi sebagai yang pertama dan satu-satunya cepat argumen. Hasil dari
konversi tidak ditentukan jika nilai KONVFMT bukan format titik-mengambang
spesifikasi. Volume POSIX.1-2008 ini tidak menentukan konversi eksplisit antara
angka dan string. Aplikasi dapat memaksa ekspresi diperlakukan sebagai angka dengan
menambahkan nol padanya, atau dapat memaksanya untuk diperlakukan sebagai string dengan menggabungkan null
rangkaian ("") untuk itu.
Nilai string harus dianggap sebagai numerik string jika berasal dari salah satu dari berikut ini:
1. Variabel bidang
2. Masukan dari getline() fungsi
3. NAMA FILE
4. ARGV elemen array
5. MENGEPUNG elemen array
6. Elemen array dibuat oleh membagi() fungsi
7. Penugasan variabel baris perintah
8. Penetapan variabel dari variabel string numerik lain
dan kondisi yang bergantung pada implementasi yang sesuai dengan kasus (a) atau (b) di bawah ini adalah
bertemu.
sebuah. Setelah setara dengan panggilan berikut ke fungsi yang ditentukan oleh ISO C
standar, string_nilai_akhir akan berbeda dari string_nilai, dan karakter apa pun sebelumnya
karakter nol yang mengakhiri di string_nilai_akhir akan menjadi karakter:
tangki *string_nilai_end;
setlokal(LC_NUMERIC, "");
nilai angka = jalan (nilai_string, &string_nilai_end);
B. Setelah semua konversi berikut diterapkan, string yang dihasilkan akan:
secara leksikal diakui sebagai NOMOR token seperti yang dijelaskan oleh konvensi leksikal di
Tatabahasa:
-- Semua memimpin dan mengikuti karakter dibuang.
-- Jika yang pertama bukan- adalah '+' or '−', itu dibuang.
-- Setiap kemunculan karakter titik desimal dari lokal saat ini diubah
untuk .
Dalam kasus (a) nilai numerik dari numerik string akan menjadi nilai yang akan menjadi
dikembalikan oleh jalan() panggilan. Dalam kasus (b) jika non-pertama adalah '−', angka
nilai dari numerik string akan menjadi negasi dari nilai numerik yang diakui
NOMOR token; jika tidak, nilai numerik dari numerik string akan menjadi numerik
nilai yang diakui NOMOR token. Apakah string adalah a numerik string seharusnya
hanya relevan dalam konteks di mana istilah itu digunakan di bagian ini.
Ketika ekspresi digunakan dalam konteks Boolean, jika memiliki nilai numerik, nilai
nol akan dianggap salah dan nilai lainnya dianggap benar. Jika tidak,
nilai string dari string nol akan diperlakukan sebagai salah dan nilai lainnya harus
diperlakukan sebagai benar. Konteks Boolean harus salah satu dari berikut ini:
* Subekspresi pertama dari ekspresi bersyarat
* Ekspresi yang dioperasikan dengan logika NOT, logika AND, atau logika OR
* Ekspresi kedua dari a untuk pernyataan
* Ekspresi an if pernyataan
* Ekspresi dari sementara klausa dalam a sementara or do...sementara pernyataan
* Ekspresi yang digunakan sebagai pola (seperti dalam Struktur Program Keseluruhan)
Semua aritmatika harus mengikuti semantik aritmatika titik-mengambang seperti yang ditentukan oleh
Standar ISO C (lihat Bagian 1.1.2, Konsep Berasal dari itu ISO C Standar).
Nilai ekspresi:
expr1 ^ expr2
harus setara dengan nilai yang dikembalikan oleh panggilan fungsi standar ISO C:
aduh(expr1, expr2)
Ekspresi:
nilai ^= cepat
harus setara dengan ekspresi standar ISO C:
nilai = pow(nilai, cepat)
kecuali bahwa lvalue harus dievaluasi hanya sekali. Nilai ekspresi:
expr1 % expr2
harus setara dengan nilai yang dikembalikan oleh panggilan fungsi standar ISO C:
fmod(expr1, expr2)
Ekspresi:
nilai %= cepat
harus setara dengan ekspresi standar ISO C:
nilai = fmod(nilai, cepat)
kecuali bahwa lvalue harus dievaluasi hanya sekali.
Variabel dan bidang harus ditetapkan oleh pernyataan penugasan:
nilai = ekspresi
dan jenis ekspresi akan menentukan jenis variabel yang dihasilkan. Tugas
termasuk tugas aritmatika ("+=", "−=", "*=", "/=", "%=", "^=", "++", "−−") semua
yang akan menghasilkan hasil numerik. Sisi kiri tugas dan
target operator kenaikan dan penurunan dapat berupa salah satu variabel, array dengan indeks,
atau pemilih bidang.
The Wow bahasa persediaan array yang digunakan untuk menyimpan angka atau string. Array
tidak perlu dideklarasikan. Mereka awalnya akan kosong, dan ukurannya akan berubah
secara dinamis. Subskrip, atau pengidentifikasi elemen, adalah string, menyediakan jenis
kemampuan array asosiatif. Nama array diikuti oleh subskrip dalam tanda kurung siku
dapat digunakan sebagai nilai dan dengan demikian sebagai ekspresi, seperti yang dijelaskan dalam tata bahasa; melihat
Tatabahasa. Nama array yang tidak memiliki langganan hanya dapat digunakan dalam konteks berikut:
* Parameter dalam definisi fungsi atau panggilan fungsi
* The NAMA token mengikuti penggunaan kata kunci apa pun in seperti yang ditentukan dalam tata bahasa (lihat
Tatabahasa); jika nama yang digunakan dalam konteks ini bukan nama array, perilakunya adalah
tidak terdefinisi
Array yang valid indeks harus terdiri dari satu atau lebih -ekspresi yang dipisahkan, mirip dengan
cara di mana array multi-dimensi diindeks dalam beberapa bahasa pemrograman.
Karena Wow array benar-benar satu dimensi, seperti -daftar yang dipisahkan adalah
dikonversi ke string tunggal dengan menggabungkan nilai string dari yang terpisah
ekspresi, masing-masing dipisahkan satu sama lain oleh nilai SUBSEPS variabel. Dengan demikian,
berikut dua operasi indeks harus setara:
adalah[expr1, expr2, ... exrn]
adalah[expr1 SUBSEPS expr2 SUBSEP... SUBSEP exrn]
Aplikasi harus memastikan bahwa multi-dimensi indeks digunakan dengan in operatornya adalah
dalam kurung. Itu in operator, yang menguji keberadaan array tertentu
elemen, tidak akan menyebabkan elemen itu ada. Referensi lain ke array yang tidak ada
elemen akan secara otomatis membuatnya.
Perbandingan (dengan '<', "<=", "!=", "==", '>', dan ">=" operator) harus dibuat
numerik jika kedua operan numerik, jika satu numerik dan yang lainnya memiliki string
nilai yang merupakan string numerik, atau jika salah satunya numerik dan yang lainnya tidak diinisialisasi
nilai. Jika tidak, operan harus dikonversi ke string sesuai kebutuhan dan string
perbandingan harus dilakukan dengan menggunakan urutan susunan khusus lokal. Nilai dari
ekspresi perbandingan harus 1 jika relasinya benar, atau 0 jika relasinya salah.
Variabel dan Khusus Variabel
Variabel dapat digunakan dalam Wow program dengan merujuknya. Kecuali
parameter fungsi (lihat Ditetapkan pengguna Fungsi), mereka tidak secara eksplisit dinyatakan.
Nama parameter fungsi harus lokal ke fungsi; semua nama variabel lainnya adalah
global. Nama yang sama tidak boleh digunakan sebagai nama parameter fungsi dan sebagai nama
dari fungsi atau khusus Wow variabel. Nama yang sama tidak boleh digunakan keduanya sebagai
nama variabel dengan cakupan global dan sebagai nama fungsi. Nama yang sama tidak boleh
digunakan dalam lingkup yang sama baik sebagai variabel skalar dan sebagai array. tidak diinisialisasi
variabel, termasuk variabel skalar, elemen array, dan variabel bidang, harus memiliki
nilai yang tidak diinisialisasi. Nilai yang tidak diinisialisasi harus memiliki nilai numerik nol dan a
nilai string dari string kosong. Evaluasi variabel dengan nilai yang tidak diinisialisasi, untuk
baik string atau numerik, harus ditentukan oleh konteks di mana mereka digunakan.
Variabel bidang harus ditunjuk oleh a '$' diikuti oleh angka atau ekspresi numerik.
Efek dari nomor bidang ekspresi mengevaluasi apa pun selain non-negatif
bilangan bulat tidak ditentukan; variabel yang tidak diinisialisasi atau nilai string tidak perlu dikonversi ke
nilai numerik dalam konteks ini. Variabel bidang baru dapat dibuat dengan menetapkan nilai ke
mereka. Referensi ke bidang yang tidak ada (yaitu, bidang setelah $NF), harus mengevaluasi ke
nilai yang tidak diinisialisasi. Referensi tersebut tidak boleh membuat bidang baru. Namun, menugaskan ke
bidang tidak ada (misalnya, $(NF+2)=5) akan meningkatkan nilai NF; buat apa saja
mengintervensi bidang dengan nilai yang tidak diinisialisasi; dan menyebabkan nilai $0 menjadi
dihitung ulang, dengan bidang yang dipisahkan oleh nilai FSO. Setiap variabel bidang
harus memiliki nilai string atau nilai yang tidak diinisialisasi saat dibuat. Variabel bidang harus
memiliki nilai yang tidak diinisialisasi saat dibuat dari $0 menggunakan FS dan variabel tidak
mengandung karakter apapun. Jika sesuai, variabel bidang harus dianggap sebagai numerik
tali (lihat Ekspresi in Wow).
Implementasi harus mendukung variabel khusus lainnya berikut yang ditetapkan oleh: Wow:
ARGC Banyaknya elemen dalam ARGV Himpunan.
ARGV Array argumen baris perintah, tidak termasuk opsi dan program argumen,
bernomor dari nol sampai ARGC−1.
Argumen dalam ARGV dapat diubah atau ditambahkan ke; ARGC dapat diubah. sebagai masing-masing
file masukan berakhir, Wow akan memperlakukan elemen non-null berikutnya dari ARGV, sampai
nilai saat ini dari ARGC1, inklusif, sebagai nama file input berikutnya. Jadi,
menetapkan elemen dari ARGV ke null berarti tidak akan diperlakukan sebagai
berkas masukan. Nama '−' menunjukkan masukan standar. Jika argumen cocok
format dari sebuah tugas operan, argumen ini harus diperlakukan sebagai
tugas bukan a fillet argumen.
KONVFMT The Printf format untuk mengonversi angka menjadi string (kecuali untuk keluaran
pernyataan, dimana OFMT digunakan); "%.6g" secara default
MENGEPUNG Array yang mewakili nilai lingkungan, seperti yang dijelaskan dalam eksekutif
fungsi yang didefinisikan dalam volume Antarmuka Sistem POSIX.1-2008. indeks
dari array harus berupa string yang terdiri dari nama-nama lingkungan
variabel, dan nilai setiap elemen array harus berupa string yang terdiri dari
nilai variabel itu. Jika sesuai, variabel lingkungan harus:
dianggap sebagai numerik string (Lihat Ekspresi in Wow); elemen array harus
juga memiliki nilai numeriknya.
Dalam semua kasus di mana perilaku Wow dipengaruhi oleh variabel lingkungan
(termasuk lingkungan dari setiap perintah yang Wow dijalankan melalui sistem
fungsi atau melalui pengalihan pipa dengan mencetak pernyataan, itu Printf
pernyataan, atau getline fungsi), lingkungan yang digunakan harus
lingkungan pada saat Wow mulai mengeksekusi; itu adalah implementasi-didefinisikan
apakah ada modifikasi dari MENGEPUNG mempengaruhi lingkungan ini.
NAMA FILE Nama path dari file input saat ini. Di dalam MULAI tindakan nilainya adalah
tidak terdefinisi. Di dalam dan AKHIR tindakan nilainya akan menjadi nama input terakhir
berkas diproses.
FNR Nomor urut dari catatan saat ini dalam file saat ini. Di dalam MULAI
tindakan nilainya harus nol. Di dalam dan AKHIR tindakan nilainya akan menjadi
jumlah record terakhir yang diproses dalam file terakhir yang diproses.
FS Ekspresi reguler pemisah bidang input; sebuah secara default.
NF Jumlah bidang dalam catatan saat ini. Di dalam MULAI tindakan, penggunaan NF
tidak terdefinisi kecuali a getline fungsi tanpa a adalah argumen dieksekusi
sebelumnya. Di dalam dan AKHIR tindakan, NF akan mempertahankan nilai yang dimilikinya untuk yang terakhir
merekam membaca, kecuali berikutnya, diarahkan, getline fungsi tanpa a adalah
argumen dilakukan sebelum memasuki AKHIR tindakan.
NR Nomor urut dari record saat ini dari awal input. Di dalam
MULAI tindakan nilainya harus nol. Di dalam dan AKHIR tindakan nilainya harus
jumlah record terakhir yang diproses.
OFMT The Printf format untuk mengonversi angka menjadi string dalam pernyataan keluaran (lihat
Keluaran Laporan); "%.6g" secara default. Hasil konversinya adalah
tidak ditentukan jika nilai OFMT bukan spesifikasi format titik-mengambang.
FSO The mencetak pemisah bidang keluaran pernyataan; secara default.
ORS The mencetak pemisah catatan keluaran pernyataan; sebuah secara default.
PANJANG Panjang senar dicocokkan dengan pertandingan fungsi.
RS Karakter pertama dari nilai string dari RS akan menjadi catatan masukan
pemisah; sebuah secara default. Jika RS berisi lebih dari satu karakter,
hasil tidak ditentukan. Jika RS adalah nol, maka catatan dipisahkan oleh urutan
terdiri dari ditambah satu atau lebih baris kosong, awal atau akhir
baris kosong tidak boleh menghasilkan catatan kosong di awal atau akhir
masukan, dan akan selalu menjadi pemisah bidang, apa pun yang
nilai FS adalah.
MULAI Posisi awal senar dicocokkan dengan pertandingan fungsi, penomoran
dari 1. Ini akan selalu setara dengan nilai pengembalian dari pertandingan
fungsi.
SUBSEPS String pemisah subskrip untuk array multidimensi; nilai default
adalah implementasi-didefinisikan.
Reguler Ekspresi
The Wow utilitas akan menggunakan notasi ekspresi reguler yang diperluas (lihat Basis
Definisi volume POSIX.1-2008, Bagian 9.4, luas Reguler Ekspresi) kecuali itu
itu akan memungkinkan penggunaan konvensi bahasa-C untuk keluar dari karakter khusus di dalam
ERE, sebagaimana ditentukan dalam tabel dalam volume Definisi Dasar POSIX.1-2008,
Bab 5, File dibentuk catatan ('\\', '\A', '\B', '\F', '\n', '\R', '\T', '\v') Dan
tabel berikut; urutan pelarian ini harus dikenali baik di dalam maupun di luar
ekspresi kurung. Perhatikan bahwa catatan tidak perlu dipisahkan oleh karakter dan
konstanta string dapat berisi karakter, jadi bahkan "\n" urutan berlaku di
Wow ERE. Menggunakan sebuah karakter dalam ERE membutuhkan pelarian yang ditunjukkan dalam
tabel berikut.
tabel 4-2: Melarikan diri Urutan in Wow
┌─────────┬────────────────────────────────────┬── ──────────────────────────────────┐
│ Melarikan diri │ │ │.
│Urutan │ Uraian Teknis │ Arti │
├─────────┼────────────────────────────────────┼── ──────────────────────────────────┤
\" │ karakter
├─────────┼────────────────────────────────────┼── ──────────────────────────────────┤
\/ │ karakter
├─────────┼────────────────────────────────────┼── ──────────────────────────────────┤
\ddd A karakter diikuti Karakter yang penyandiannya adalah
dengan urutan terpanjang dari satu, diwakili oleh satu, dua, atau
dua, atau tiga angka oktal bilangan bulat oktal tiga angka. Multi-
karakter (01234567). Jika semua karakter byte membutuhkan banyak,
digitnya adalah 0 (yaitu, rangkaian escape gabungan dari
representasi dari NUL jenis ini, termasuk leading terkemuka
karakter), perilakunya adalah untuk setiap byte. │
tidak terdefinisi. │ │
├─────────┼────────────────────────────────────┼── ──────────────────────────────────┤
\c A karakter diikuti Tidak ditentukan
oleh karakter apa pun yang tidak dijelaskan dalam
tabel ini atau di tabel di
Definisi Dasar volume
POSIX.1-2008, Bab 5, File │ │.
│ │. dibentuk catatan ('\\', '\A', '\B',
│ │. '\F', '\n', '\R', '\T', '\v'). │ │.
└─────────┴────────────────────────────────────┴── ──────────────────────────────────┘
Ekspresi reguler dapat dicocokkan dengan bidang atau string tertentu dengan menggunakan salah satu dari
dua operator pencocokan ekspresi reguler, '~' dan "!~". Operator ini harus menafsirkan
operan tangan kanan mereka sebagai ekspresi reguler dan operan tangan kiri mereka sebagai string.
Jika ekspresi reguler cocok dengan string, '~' ekspresi harus mengevaluasi ke nilai
dari 1, dan "!~" ekspresi akan mengevaluasi ke nilai 0. (Ekspresi reguler
operasi pencocokan adalah seperti yang didefinisikan oleh istilah yang cocok dalam volume Definisi Dasar dari
POSIX.1-2008, Bagian 9.1, Reguler Ekspresi Definisi, di mana kecocokan terjadi pada
bagian dari string kecuali ekspresi reguler dibatasi dengan atau
karakter khusus.) Jika ekspresi reguler tidak cocok dengan string,
itu '~' ekspresi harus mengevaluasi ke nilai 0, dan "!~" ekspresi harus mengevaluasi
ke nilai 1. Jika operan tangan kanan adalah ekspresi apa pun selain token leksikal
SEBELUM, nilai string dari ekspresi harus ditafsirkan sebagai perpanjangan reguler
ekspresi, termasuk konvensi escape yang dijelaskan di atas. Perhatikan bahwa pelarian yang sama ini
konvensi juga harus diterapkan dalam menentukan nilai string literal (the
token leksikal STRING), dan dengan demikian harus diterapkan untuk kedua kalinya ketika literal string adalah
digunakan dalam konteks ini.
Ketika sebuah SEBELUM token muncul sebagai ekspresi dalam konteks apa pun selain sebagai tangan kanan
itu '~' or "!~" operator atau sebagai salah satu argumen fungsi bawaan yang dijelaskan di bawah ini,
nilai ekspresi yang dihasilkan harus setara dengan:
$0 " " /sebelum/
The sebelum argumen untuk gsub, pertandingan, di bawah fungsi, dan fs argumen untuk membagi
fungsi (lihat String Fungsi) harus ditafsirkan sebagai ekspresi reguler yang diperluas.
Ini bisa berupa SEBELUM token atau ekspresi sewenang-wenang, dan harus ditafsirkan dalam
dengan cara yang sama seperti sisi kanan '~' or "!~" operator.
Ekspresi reguler yang diperluas dapat digunakan untuk memisahkan bidang dengan menetapkan string
berisi ekspresi ke variabel bawaan FS, baik secara langsung maupun sebagai akibatnya
menggunakan F sepstring pilihan. Nilai default dari FS variabel harus tunggal
. Berikut ini menjelaskan FS tingkah laku:
1. Jika FS adalah string nol, perilaku tidak ditentukan.
2. Jika FS adalah satu karakter:
A. Jika FS adalah , lewati awal dan akhir dan karakter;
bidang harus dibatasi oleh set satu atau lebih atau karakter.
B. Jika tidak, jika FS apakah ada karakter lain? c, bidang harus dibatasi oleh masing-masing
kejadian tunggal c.
3. Jika tidak, nilai string dari FS akan dianggap sebagai perpanjangan reguler
ekspresi. Setiap kemunculan urutan yang cocok dengan ekspresi reguler yang diperluas
akan membatasi bidang.
Kecuali untuk '~' dan "!~" operator, dan dalam gsub, pertandingan, membagi, dan di bawah built-in
fungsi, pencocokan ERE harus didasarkan pada catatan input; yaitu, pemisah rekaman
karakter (karakter pertama dari nilai variabel RS, secara default)
tidak dapat disematkan dalam ekspresi, dan tidak ada ekspresi yang cocok dengan pemisah rekaman
karakter. Jika pemisah catatan tidak , karakter yang tertanam di
ekspresi dapat dicocokkan. Untuk '~' dan "!~" operator, dan dalam empat built-in
fungsi, pencocokan ERE harus didasarkan pada string teks; yaitu, karakter apa pun (termasuk
dan pemisah rekaman) dapat disematkan dalam pola, dan yang sesuai
pola harus cocok dengan karakter apa pun. Namun, dalam semua Wow Pencocokan ERE, penggunaan satu atau
lebih banyak karakter NUL dalam pola, catatan input, atau string teks menghasilkan tidak terdefinisi
hasil.
Pola
A belt hold apakah ada yang valid? ekspresi, rentang yang ditentukan oleh dua ekspresi yang dipisahkan oleh a
koma, atau salah satu dari dua pola khusus MULAI or AKHIR.
Khusus Pola
The Wow utilitas harus mengenali dua pola khusus, MULAI dan AKHIR. Masing-masing MULAI belt hold
harus dicocokkan satu kali dan tindakan terkaitnya dieksekusi sebelum catatan input pertama
dibaca—kecuali mungkin dengan menggunakan getline fungsi (lihat Input / Output dan Umum
Fungsi) sebelumnya MULAI action—dan sebelum penetapan baris perintah selesai. Setiap AKHIR
pola harus dicocokkan satu kali dan tindakan terkaitnya dilakukan setelah catatan terakhir dari
masukan telah dibaca. Kedua pola ini harus memiliki tindakan terkait.
MULAI dan AKHIR tidak boleh digabungkan dengan pola lain. beberapa MULAI dan AKHIR pola harus
diperkenankan. Tindakan yang terkait dengan MULAI pola harus dieksekusi dalam urutan
ditentukan dalam program, seperti AKHIR tindakan. Sebuah AKHIR pola dapat mendahului a MULAI
pola dalam sebuah program.
Jika Wow program hanya terdiri dari tindakan dengan pola MULAI, Dan MULAI tindakan
mengandung no getline fungsi, Wow akan keluar tanpa membaca inputnya saat yang terakhir
pernyataan terakhir MULAI tindakan dijalankan. Jika Wow program hanya terdiri dari tindakan
dengan polanya AKHIR atau hanya tindakan dengan pola MULAI dan AKHIR, masukannya adalah
baca sebelum pernyataan di AKHIR tindakan dijalankan.
Ekspresi Pola
Pola ekspresi harus dievaluasi seolah-olah itu adalah ekspresi dalam konteks Boolean.
Jika hasilnya benar, pola akan dianggap cocok, dan tindakan terkait
(jika ada) harus dieksekusi. Jika hasilnya salah, tindakan tidak akan dilakukan.
pola Ranges
Rentang pola terdiri dari dua ekspresi yang dipisahkan oleh koma; dalam hal ini, tindakan
harus dilakukan untuk semua rekaman antara kecocokan ekspresi pertama dan
kecocokan berikut dari ekspresi kedua, inklusif. Pada titik ini, rentang pola dapat
diulangi mulai dari catatan input setelah akhir rentang yang cocok.
tindakan
Tindakan adalah urutan pernyataan seperti yang ditunjukkan dalam tata bahasa di Tatabahasa. Single apa saja
pernyataan dapat diganti dengan daftar pernyataan yang diapit kurung kurawal. Aplikasi
harus memastikan bahwa pernyataan dalam daftar pernyataan dipisahkan oleh: atau
karakter. Pernyataan dalam daftar pernyataan harus dieksekusi secara berurutan dalam urutan
bahwa mereka muncul.
The ekspresi bertindak sebagai kondisional dalam if pernyataan harus dievaluasi dan jika
bukan nol atau bukan nol, pernyataan berikut harus dijalankan; jika tidak, jika lain is
hadir, pernyataan berikut lain akan dieksekusi.
The if, sementara, do...sementara, untuk, istirahat, dan terus pernyataan didasarkan pada ISO C
standar (lihat Bagian 1.1.2, Konsep Berasal dari itu ISO C Standar), kecuali bahwa
Ekspresi Boolean harus diperlakukan seperti yang dijelaskan dalam Ekspresi in Wow, dan kecuali dalam
kasus:
untuk (variabel in susunan)
yang harus diulang, menugaskan masing-masing indeks of susunan untuk variabel dalam urutan yang tidak ditentukan.
Hasil penambahan elemen baru ke susunan dalam seperti untuk lingkaran tidak terdefinisi. Jika sebuah
istirahat or terus pernyataan terjadi di luar loop, perilaku tidak terdefinisi.
The hapus pernyataan akan menghapus elemen array individu. Jadi, kode berikut
menghapus seluruh array:
untuk (indeks in Himpunan)
hapus larik[indeks]
The berikutnya pernyataan akan menyebabkan semua pemrosesan lebih lanjut dari catatan input saat ini menjadi
ditinggalkan. Perilaku tidak terdefinisi jika berikutnya pernyataan muncul atau dipanggil dalam a MULAI
or AKHIR tindakan.
The keluar pernyataan akan memanggil semua AKHIR tindakan dalam urutan di mana mereka terjadi dalam
sumber program dan kemudian menghentikan program tanpa membaca masukan lebih lanjut. Sebuah keluar
pernyataan di dalam an AKHIR tindakan akan menghentikan program tanpa eksekusi lebih lanjut dari
AKHIR tindakan. Jika ekspresi ditentukan dalam keluar pernyataan, nilai numeriknya harus
menjadi status keluar dari Wow, kecuali kesalahan berikutnya ditemukan atau kesalahan berikutnya keluar
pernyataan dengan ekspresi dieksekusi.
Keluaran Laporan
Kedua mencetak dan Printf pernyataan harus menulis ke output standar secara default. Hasil
harus ditulis ke lokasi yang ditentukan oleh keluaran_pengalihan jika ada yang disediakan, sebagai
berikut:
> ekspresi
>> ekspresi
| ekspresi
Dalam semua kasus, file ekspresi harus dievaluasi untuk menghasilkan string yang digunakan sebagai
pathname untuk menulis (untuk '>' or ">>") atau sebagai perintah yang akan dieksekusi (untuk '|').
Menggunakan dua formulir pertama, jika file dengan nama itu saat ini tidak terbuka, itu akan menjadi
dibuka, membuatnya jika perlu dan menggunakan formulir pertama, memotong file. Hasil
kemudian akan ditambahkan ke file. Selama file tetap terbuka, panggilan berikutnya masuk
yang ekspresi mengevaluasi ke nilai string yang sama hanya akan menambahkan output ke
mengajukan. File tetap terbuka sampai menutup penjualan fungsi (lihat Input / Output dan Umum
Fungsi) dipanggil dengan ekspresi yang mengevaluasi nilai string yang sama.
Bentuk ketiga harus menulis output ke aliran yang disalurkan ke input perintah. Itu
aliran akan dibuat jika tidak ada aliran yang saat ini terbuka dengan nilai ekspresi sebagai miliknya
nama perintah. Aliran yang dibuat harus setara dengan aliran yang dibuat oleh panggilan ke
buka() fungsi yang didefinisikan dalam volume Antarmuka Sistem POSIX.1-2008 dengan nilai
ekspresi sebagai Command argumen dan nilai w sebagai mode argumen. Selama
aliran tetap terbuka, panggilan berikutnya di mana ekspresi mengevaluasi ke string yang sama
nilai akan menulis output ke aliran yang ada. Aliran akan tetap terbuka sampai
menutup penjualan fungsi (lihat Input / Output dan Umum Fungsi) disebut dengan ekspresi bahwa
mengevaluasi ke nilai string yang sama. Pada saat itu, sungai akan ditutup seolah-olah oleh
panggilan ke tutup() fungsi yang ditentukan dalam volume Antarmuka Sistem POSIX.1-2008.
Seperti yang dijelaskan secara rinci oleh tata bahasa di Tatabahasa, pernyataan keluaran ini akan mengambil
-daftar terpisah dari ekspresis dirujuk dalam tata bahasa oleh non-terminal
simbol expr_list, print_expr_list, atau print_expr_list_opt. Daftar ini dirujuk di sini
sebagai ekspresi daftar, dan setiap anggota disebut sebagai ekspresi argumen.
The mencetak pernyataan harus menulis nilai setiap argumen ekspresi ke yang ditunjukkan
aliran keluaran dipisahkan oleh pemisah bidang keluaran saat ini (lihat variabel FSO atas),
dan diakhiri oleh pemisah catatan keluaran (lihat variabel ORS di atas). Semua ekspresi
argumen harus dianggap sebagai string, yang dikonversi jika perlu; konversi ini harus
menjadi seperti yang dijelaskan dalam Ekspresi in Wow, dengan pengecualian bahwa Printf format dalam OFMT
harus digunakan sebagai ganti nilai dalam KONVFMT. Daftar ekspresi kosong akan berdiri untuk
seluruh catatan masukan ($0).
The Printf pernyataan harus menghasilkan output berdasarkan notasi yang mirip dengan Format File
Notasi yang digunakan untuk menjelaskan format file dalam volume POSIX.1-2008 ini (lihat Basis
Definisi volume POSIX.1-2008, Bab 5, File dibentuk catatan). Keluaran harus
diproduksi seperti yang ditentukan dengan yang pertama ekspresi argumen sebagai string format dan
selanjutnya ekspresi argumen sebagai string argumen1 untuk argn, inklusif, dengan berikut ini
pengecualian:
1. Itu format akan menjadi string karakter yang sebenarnya daripada representasi grafis.
Oleh karena itu, tidak boleh berisi posisi karakter kosong. Itu dalam format
string, dalam konteks apa pun selain a bendera dari spesifikasi konversi, harus
diperlakukan sebagai karakter biasa yang disalin ke output.
2. Jika set karakter berisi '' karakter dan karakter itu muncul di format
string, itu akan diperlakukan sebagai karakter biasa yang disalin ke output.
3. Itu melarikan diri urutan dimulai dengan karakter harus diperlakukan sebagai
urutan karakter biasa yang disalin ke output. Perhatikan bahwa ini sama
urutan harus ditafsirkan secara leksikal oleh Wow ketika mereka muncul dalam string literal,
tetapi mereka tidak akan diperlakukan secara khusus oleh Printf pernyataan.
4. Itu bidang lebar or ketelitian dapat ditentukan sebagai '*' karakter bukan digit
rangkaian. Dalam hal ini argumen berikutnya dari daftar ekspresi akan diambil dan
nilai numeriknya diambil sebagai lebar atau presisi bidang.
5. Pelaksanaan tidak boleh mendahului atau mengikuti keluaran dari d or u Konversi
karakter penentu dengan karakter tidak ditentukan oleh format String.
6. Pelaksanaan tidak boleh mendahului keluaran dari o karakter penentu konversi
dengan nol di depan yang tidak ditentukan oleh format String.
7. Untuk c karakter penentu konversi: jika argumen memiliki nilai numerik,
karakter yang pengkodeannya adalah nilai itu akan menjadi output. Jika nilainya nol atau tidak
pengkodean karakter apa pun dalam kumpulan karakter, perilaku tidak terdefinisi. jika
argumen tidak memiliki nilai numerik, karakter pertama dari nilai string harus
menjadi keluaran; jika string tidak mengandung karakter apa pun, perilakunya tidak terdefinisi.
8. Untuk setiap spesifikasi konversi yang menggunakan argumen, ekspresi berikutnya
argumen harus dievaluasi. Kecuali c penentu konversi
karakter, nilainya harus dikonversi (sesuai dengan aturan yang ditentukan dalam
Ekspresi in Wow) ke jenis yang sesuai untuk spesifikasi konversi.
9. Jika argumen ekspresi tidak mencukupi untuk memenuhi semua konversi
spesifikasi di format string, perilaku tidak terdefinisi.
10. Jika ada urutan karakter dalam format string dimulai dengan '%' karakter, tetapi apakah
tidak membentuk spesifikasi konversi yang valid, perilaku tidak ditentukan.
Kedua mencetak dan Printf dapat menghasilkan setidaknya {LINE_MAX} byte.
Fungsi
The Wow bahasa memiliki berbagai fungsi bawaan: aritmatika, string, input/output,
dan umum.
Hitung Fungsi
Fungsi aritmatika, kecuali int, harus didasarkan pada standar ISO C (lihat
Bagian 1.1.2, Konsep Berasal dari itu ISO C Standar). Perilaku tidak terdefinisi dalam
kasus di mana standar ISO C menetapkan bahwa kesalahan akan dikembalikan atau bahwa perilakunya
tidak terdefinisi. Meskipun tata bahasa (lihat Tatabahasa) memungkinkan fungsi bawaan muncul tanpa
argumen atau tanda kurung, kecuali argumen atau tanda kurung ditunjukkan sebagai opsional dalam
daftar berikut (dengan menampilkannya di dalam "[]" kurung), penggunaan tersebut tidak terdefinisi.
atan2(y,x)
Kembalikan busur dari y/x dalam radian dalam kisaran [−π,π].
sebab(x) Kembalikan kosinus dari x, Di mana x adalah dalam radian.
dosa(x) Kembalikan sinus dari x, Di mana x adalah dalam radian.
exp(x) Mengembalikan fungsi eksponensial dari x.
mencatat(x) Kembalikan logaritma natural dari x.
persegi(x) Kembalikan akar kuadrat dari x.
int(x) Kembalikan argumen yang terpotong ke bilangan bulat. Pemotongan akan menuju 0 ketika
x> 0.
baris() Kembalikan nomor acak n, sehingga 0≤n
pasir([cepat])
Tetapkan nilai benih untuk baris untuk cepat atau gunakan waktu jika cepat dihilangkan.
Nilai benih sebelumnya akan dikembalikan.
String Fungsi
Fungsi string dalam daftar berikut harus didukung. Meskipun tata bahasa (lihat
Tatabahasa) mengizinkan fungsi bawaan untuk muncul tanpa argumen atau tanda kurung, kecuali jika
argumen atau tanda kurung ditunjukkan sebagai opsional dalam daftar berikut (dengan menampilkan
mereka di dalam "[]" kurung), penggunaan tersebut tidak terdefinisi.
gsub(sebelum, membalas[, in])
Berperilaku seperti di bawah (lihat di bawah), kecuali bahwa itu akan menggantikan semua kejadian dari
ekspresi reguler (seperti ed pengganti global utilitas) dalam $0 atau dalam in
argumen, ketika ditentukan.
indeks(s, t)
Kembalikan posisi, dalam karakter, penomoran dari 1, dalam string s di mana string t
pertama terjadi, atau nol jika tidak terjadi sama sekali.
panjang[([s])]
Kembalikan panjang, dalam karakter, dari argumennya yang diambil sebagai string, atau dari
seluruh catatan, $0, jika tidak ada argumen.
pertandingan(s, sebelum)
Kembalikan posisi, dalam karakter, penomoran dari 1, dalam string s dimana
ekspresi reguler diperpanjang sebelum terjadi, atau nol jika tidak terjadi sama sekali.
RSTART harus diatur ke posisi awal (yang sama dengan yang dikembalikan
nilai), nol jika tidak ada kecocokan yang ditemukan; RLENGTH harus diatur ke panjang
string yang cocok, 1 jika tidak ditemukan kecocokan.
membagi(s, a[, fs ])
Pisahkan talinya s menjadi elemen array a[1], a[2], ..., a[n], dan kembali n. Semua
elemen array harus dihapus sebelum pemisahan dilakukan. Itu
pemisahan harus dilakukan dengan ERE fs atau dengan pemisah bidang FS if fs is
tidak diberikan. Setiap elemen array harus memiliki nilai string saat dibuat dan, jika
sesuai, elemen array harus dianggap sebagai string numerik (lihat
Ekspresi in Wow). Efek dari string nol sebagai nilai fs is
tidak ditentukan.
lari cepat(fmt, cepat, cepat, ...)
Format ekspresi sesuai dengan Printf format yang diberikan oleh fmt dan kembali
string yang dihasilkan.
sub(sebelum, membalas[, in ])
Ganti stringnya membalas sebagai pengganti contoh pertama dari perpanjangan
ekspresi reguler SEBELUM dalam tali in dan mengembalikan jumlah substitusi. Sebuah
('&') muncul di string membalas akan diganti dengan string
dari in yang cocok dengan ERE. Sebuah didahului dengan sebaiknya
ditafsirkan secara literal karakter. Terjadinya dua
berurutan karakter harus ditafsirkan hanya sebagai satu literal
karakter. Kejadian lain dari a (Misalnya,
mendahului karakter lain) harus diperlakukan sebagai literal
karakter. Perhatikan bahwa jika membalas adalah string literal (token leksikal STRING; Lihat
Tatabahasa), penanganan karakter muncul setelah leksikal
pemrosesan, termasuk leksikal apa pun -pemrosesan urutan pelarian. Jika in
ditentukan dan itu bukan nilai (lihat Ekspresi in Wow), perilakunya adalah
tidak terdefinisi. Jika in dihilangkan, Wow akan menggunakan catatan saat ini ($0) sebagai gantinya.
substr(s, m[, n ])
Kembalikan paling banyak n-substring karakter dari s yang dimulai pada posisi m,
penomoran dari 1. Jika n dihilangkan, atau jika n menentukan lebih banyak karakter daripada are
tertinggal di string, panjang substring harus dibatasi oleh panjangnya
dari tali s.
lebih rendah(s)
Kembalikan string berdasarkan string s. Setiap karakter dalam s itu huruf besar
surat yang ditentukan memiliki a lebih rendah pemetaan oleh LC_CTYPE kategori dari
lokal saat ini harus diganti dalam string yang dikembalikan dengan huruf kecil
ditentukan oleh pemetaan. Karakter lain di s tidak akan berubah dalam
string yang dikembalikan.
puncak(s)
Kembalikan string berdasarkan string s. Setiap karakter dalam s itu huruf kecil
surat yang ditentukan memiliki a puncak pemetaan oleh LC_CTYPE kategori dari
lokal saat ini diganti dalam string yang dikembalikan dengan huruf besar
ditentukan oleh pemetaan. Karakter lain di s tidak berubah dalam pengembalian
String.
Semua fungsi sebelumnya yang mengambil SEBELUM sebagai parameter mengharapkan pola atau string
ekspresi bernilai yang merupakan ekspresi reguler seperti yang didefinisikan dalam Reguler Ekspresi.
Input / Output dan Umum Fungsi
Input/output dan fungsi umum adalah:
menutup penjualan(ekspresi)
Tutup file atau pipa yang dibuka oleh a mencetak or Printf pernyataan atau panggilan ke
getline dengan nilai string yang sama ekspresi. Batas jumlah buka
ekspresi argumen adalah implementasi-didefinisikan. Jika penutupan berhasil,
fungsi akan mengembalikan nol; jika tidak, itu akan kembali bukan nol.
ekspresi | getline [adalah]
Baca catatan input dari aliran yang disalurkan dari output perintah. Itu
aliran akan dibuat jika tidak ada aliran yang saat ini terbuka dengan nilai
ekspresi sebagai nama perintahnya. Aliran yang dibuat harus setara dengan satu
dibuat oleh panggilan ke buka() fungsi dengan nilai ekspresi sebagai
Command argumen dan nilai r sebagai mode argumen. Selama aliran
tetap terbuka, panggilan berikutnya di mana ekspresi mengevaluasi ke string yang sama
nilai akan membaca catatan berikutnya dari aliran. Aliran akan tetap ada
buka sampai menutup penjualan fungsi dipanggil dengan ekspresi yang mengevaluasi ke
nilai string yang sama. Pada saat itu, aliran akan ditutup seolah-olah dengan panggilan ke
itu tutup() fungsi. Jika adalah dihilangkan, $0 dan NF akan ditetapkan; jika tidak, adalah
harus ditetapkan dan, jika sesuai, itu akan dianggap sebagai string numerik (lihat
Ekspresi in Wow).
The getline operator dapat membentuk konstruksi ambigu ketika ada
operator yang tidak dikurung (termasuk gabungan) di sebelah kiri '|' (ke
awal dari ekspresi yang mengandung getline). Dalam konteks '$'
operator, '|' akan berperilaku seolah-olah memiliki prioritas yang lebih rendah daripada '$'. Hasil
mengevaluasi operator lain tidak ditentukan, dan aplikasi yang sesuai harus:
kurung dengan benar semua penggunaan tersebut.
getline Atur $0 ke catatan input berikutnya dari file input saat ini. Bentuk ini
getline akan mengatur NF, NR, dan FNR variabel.
getline adalah
Tetapkan variabel adalah ke catatan input berikutnya dari file input saat ini dan, jika
sesuai, adalah akan dianggap sebagai string numerik (lihat Ekspresi in Wow).
Bentuk getline akan mengatur FNR dan NR variabel.
getline [adalah] < ekspresi
Baca catatan input berikutnya dari file bernama. Itu ekspresi seharusnya
dievaluasi untuk menghasilkan string yang digunakan sebagai nama path. Jika file itu
nama saat ini tidak terbuka, itu akan dibuka. Selama alirannya tetap ada
terbuka, panggilan berikutnya di mana ekspresi mengevaluasi ke nilai string yang sama
akan membaca catatan selanjutnya dari file tersebut. File akan tetap terbuka sampai
itu menutup penjualan fungsi dipanggil dengan ekspresi yang mengevaluasi sama
nilai string. Jika adalah dihilangkan, $0 dan NF akan ditetapkan; jika tidak, adalah seharusnya
ditetapkan dan, jika sesuai, itu akan dianggap sebagai string numerik (lihat
Ekspresi in Wow).
The getline operator dapat membentuk konstruksi ambigu ketika ada
operator biner yang tidak dikurung (termasuk concatenate) di sebelah kanan '<'
(sampai akhir ekspresi yang mengandung getline). Hasil dari
mengevaluasi konstruksi seperti itu tidak ditentukan, dan aplikasi yang sesuai harus:
kurung dengan benar semua penggunaan tersebut.
sistem(ekspresi)
Jalankan perintah yang diberikan oleh ekspresi dengan cara yang setara dengan sistem()
fungsi yang didefinisikan dalam volume Antarmuka Sistem POSIX.1-2008 dan mengembalikan
status keluar dari perintah.
Semua bentuk getline akan mengembalikan 1 untuk input yang berhasil, nol untuk akhir file, dan 1 untuk
sebuah kesalahan.
Di mana string digunakan sebagai nama file atau pipa, aplikasi harus memastikan:
bahwa string secara tekstual identik. Terminologi ``nilai string yang sama'' menyiratkan
bahwa ``string yang setara'', bahkan yang hanya berbeda oleh karakter, mewakili
file yang berbeda.
Ditetapkan pengguna Fungsi
The Wow bahasa juga menyediakan fungsi yang ditentukan pengguna. Fungsi tersebut dapat didefinisikan sebagai:
fungsi nama([parameter, ...]) { Laporan }
Suatu fungsi dapat dirujuk ke mana saja dalam suatu Wow program; khususnya, penggunaannya dapat
mendahului definisinya. Ruang lingkup suatu fungsi bersifat global.
Parameter fungsi, jika ada, dapat berupa skalar atau larik; perilakunya adalah
undefined jika nama array dilewatkan sebagai parameter yang digunakan fungsi sebagai skalar, atau
jika ekspresi skalar dilewatkan sebagai parameter yang digunakan fungsi sebagai array.
Parameter fungsi harus diteruskan dengan nilai jika skalar dan dengan referensi jika nama array.
Jumlah parameter dalam definisi fungsi tidak harus sesuai dengan jumlah
parameter dalam panggilan fungsi. Kelebihan parameter formal dapat digunakan sebagai variabel lokal.
Jika lebih sedikit argumen yang diberikan dalam panggilan fungsi daripada dalam definisi fungsi,
parameter tambahan yang digunakan dalam badan fungsi sebagai skalar harus dievaluasi ke
nilai yang tidak diinisialisasi sampai sebaliknya diinisialisasi, dan parameter tambahan yang
digunakan dalam badan fungsi karena array harus diperlakukan sebagai array yang tidak diinisialisasi di mana:
setiap elemen mengevaluasi ke nilai yang tidak diinisialisasi sampai sebaliknya diinisialisasi.
Saat menjalankan suatu fungsi, tidak ada spasi kosong yang dapat ditempatkan di antara nama fungsi dan
kurung buka. Panggilan fungsi dapat disarangkan dan panggilan rekursif dapat dilakukan
fungsi. Setelah kembali dari panggilan fungsi bersarang atau rekursif, nilai dari semua
parameter fungsi panggilan tidak akan berubah, kecuali untuk parameter larik yang diteruskan
dengan referensi. Itu kembali pernyataan dapat digunakan untuk mengembalikan nilai. Jika sebuah kembali pernyataan
muncul di luar definisi fungsi, perilaku tidak terdefinisi.
Dalam definisi fungsi, karakter harus opsional sebelum pembukaan
kurung kurawal dan setelah kurung kurawal penutup. Definisi fungsi dapat muncul di mana saja dalam program
mana pola-aksi pasangan diperbolehkan.
Tatabahasa
Tata bahasa di bagian ini dan konvensi leksikal di bagian berikut harus
bersama-sama jelaskan sintaks untuk Wow program. Konvensi umum untuk gaya ini
tata bahasa dijelaskan dalam Bagian 1.3, Tatabahasa Konvensi. Program yang valid dapat berupa
direpresentasikan sebagai simbol non-terminal program dalam tata bahasa. Sintaks formal ini harus
diutamakan daripada deskripsi sintaks teks sebelumnya.
%token NAMA NOMOR STRING SEBELUM
%token FUNC_NAME /* Nama diikuti by '(' tanpa putih ruang. */
/* Kata Kunci */
%token Mulai Akhir
/* 'MULAI' 'AKHIR' */
%token Istirahat Lanjutkan Hapus Lakukan Yang Lain
/* 'break' 'lanjutkan' 'hapus' 'lakukan' 'lain' */
%token Keluar Untuk Fungsi Jika Masuk
/* 'keluar' 'untuk' 'fungsi' 'jika' 'masuk' */
%token Cetak Selanjutnya Cetak Kembali Sementara
/* 'selanjutnya' 'print' 'printf' 'kembali' 'sementara' */
/* Nama fungsi yang dicadangkan */
%token BUILTIN_FUNC_NAME
/* Satu token untuk yang berikut ini:
* atan2 cos sin exp log sqrt int rand srand
* panjang indeks gsub cocok dengan sub sprintf split
* substr ke bawah ke sistem tutup atas
*/
%token GETLINE
/* Secara sintaksis berbeda dari built-in lainnya. */
/* Token dua karakter. */
%token ADD_ASSIGN SUB_ASSIGN MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN POW_ASSIGN
/* '+=' '−=' '*=' '/=' '%=' '^=' */
%token ATAU DAN NO_MATCH EQ LE GE NE INCR DECR APPEND
/* '||' '&&' '!~' '==' '<=' '>=' '!=' '++' '−−' '>>' */
/* Token satu karakter. */
%token '{' '}' '(' ')' '[' ']' ',' ';' GARIS BARU
%token '+' '−' '*' '%' '^' '!' '>' '<' '|' '?' ':' ' " " ' '$' '='
%mulai program
%%
program : daftar_item
| daftar_item_tanpa tindakan
;
item_list : baris baru_opt
| actionless_item_list terminator item
| item_list terminator item
| terminator tindakan item_list
;
actionless_item_list : terminator pola item_list
| terminator pola actionless_item_list
;
item: tindakan pola
| NAMA Fungsi '(' param_list_opt ')'
tindakan newline_opt
| Fungsi FUNC_NAME '(' param_list_opt ')'
tindakan newline_opt
;
param_list_opt : /* kosong */
| daftar_param
;
daftar_param : NAME
| param_list ',' NAME
;
pola: Mulai
| Akhir
| expr
| expr ',' baris baru_opt expr
;
tindakan : '{' newline_opt '}'
| '{' baris baru_opt diakhiri_pernyataan_daftar '}'
| '{' newline_opt unterminated_statement_list '}'
;
terminator : terminator ';'
| terminator GARIS BARU
| ';'
| GARIS BARU
;
terakhir_pernyataan_daftar :terakhir_pernyataan
| terakhir_pernyataan_daftarterakhir_pernyataan
;
unterminated_statement_list : pernyataan_unterminated
| terminasi_pernyataan_daftar tidak terminasi_pernyataan
;
terminasi_pernyataan : tindakan baris baru_opt
| Jika '(' expr ')' baris baru_opt diakhiri_pernyataan
| Jika '(' expr ')' baris baru_opt diakhiri_pernyataan
Lain baris baru_opt diakhiri_pernyataan
| Sementara '(' expr ')' baris baru_opt diakhiri_pernyataan
| Untuk '(' simple_statement_opt ';'
expr_opt ';' simple_statement_opt ')' baris baru_opt
pernyataan_terminasi
| Untuk '(' NAMA Dalam NAMA ')' newline_opt
pernyataan_terminasi
| ';' baris baru_opt
| terminatable_statement NEWLINE baris baru_opt
| pernyataan_terminasi ';' baris baru_opt
;
unterminated_statement : pernyataan_terminatable
| Jika '(' expr ')' newline_opt unterminated_statement
| Jika '(' expr ')' baris baru_opt diakhiri_pernyataan
Lain newline_opt unterminated_statement
| Sementara '(' expr ')' newline_opt unterminated_statement
| Untuk '(' simple_statement_opt ';'
expr_opt ';' simple_statement_opt ')' baris baru_opt
pernyataan_tidak dihentikan
| Untuk '(' NAMA Dalam NAMA ')' newline_opt
pernyataan_tidak dihentikan
;
pernyataan_terminatable : pernyataan_sederhana
| Merusak
| Melanjutkan
| Berikutnya
| Keluar dari expr_opt
| Kembalikan expr_opt
| Lakukan newline_opt terminasi_statement Sementara '(' expr ')'
;
simple_statement_opt : /* kosong */
| pernyataan_sederhana
;
simple_statement : Hapus NAMA '[' expr_list ']'
| expr
| print_pernyataan
;
pernyataan_cetak : pernyataan_cetak_sederhana
| simple_print_statement keluaran_pengalihan
;
simple_print_statement : Cetak print_expr_list_opt
| Cetak '(' multiple_expr_list ')'
| Printf print_expr_list
| Printf '(' multiple_expr_list ')'
;
output_redirection : '>' expr
| TAMBAHKAN expr
| '|' expr
;
expr_list_opt : /* kosong */
| expr_list
;
expr_list : expr
| multiple_expr_list
;
multiple_expr_list : expr ',' newline_opt expr
| multiple_expr_list ',' baris baru_opt expr
;
expr_opt : /* kosong */
| expr
;
expr : unary_expr
| non_unary_expr
;
unary_expr : '+' expr
| '−' ekspr
| unary_expr '^' expr
| unary_expr '*' expr
| unary_expr '/' expr
| unary_expr '%' expr
| unary_expr '+' expr
| unary_expr '−' expr
| unary_expr bukan_unary_expr
| unary_expr '<' expr
| unary_expr LE expr
| unary_expr NE expr
| unary_expr EQ expr
| unary_expr '>' expr
| unary_expr GE expr
| unary_expr '~' expr
| unary_expr NO_MATCH expr
| unary_expr Di NAME
| unary_expr DAN newline_opt expr
| unary_expr ATAU newline_opt expr
| unary_expr '?' expr ':' expr
| unary_input_function
;
non_unary_expr : '(' expr ')'
| '!' expr
| non_unary_expr '^' expr
| non_unary_expr '*' expr
| non_unary_expr '/' expr
| non_unary_expr '%' expr
| non_unary_expr '+' expr
| non_unary_expr '−' expr
| non_unary_expr non_unary_expr
| non_unary_expr '<' expr
| non_unary_expr LE expr
| non_unary_expr NE expr
| non_unary_expr EQ expr
| non_unary_expr '>' expr
| non_unary_expr GE expr
| non_unary_expr '~' expr
| non_unary_expr NO_MATCH expr
| non_unary_expr Di NAME
| '(' multiple_expr_list ')' Di NAMA
| non_unary_expr DAN newline_opt expr
| non_unary_expr ATAU newline_opt expr
| non_unary_expr '?' expr ':' expr
| NOMOR
| RANGKAIAN
| nilai
| SEBELUM
| nilai ICR
| nilai DECR
| Nilai ICR
| Nilai DECR
| nilai POW_ASSIGN expr
| nilai MOD_ASSIGN expr
| nilai MUL_ASSIGN expr
| nilai DIV_ASSIGN expr
| nilai ADD_ASSIGN expr
| nilai SUB_ASSIGN expr
| nilai '=' expr
| FUNC_NAME '(' expr_list_opt ')'
/* tidak boleh ada spasi putih sebelum '(' */
| BUILTIN_FUNC_NAME '(' expr_list_opt ')'
| BUILTIN_FUNC_NAME
| non_unary_input_function
;
print_expr_list_opt : /* kosong */
| print_expr_list
;
print_expr_list : print_expr
| print_expr_list ',' baris baru_opt print_expr
;
print_expr : unary_print_expr
| non_unary_print_expr
;
unary_print_expr : '+' print_expr
| '−' print_expr
| unary_print_expr '^' print_expr
| unary_print_expr '*' print_expr
| unary_print_expr '/' print_expr
| unary_print_expr '%' print_expr
| unary_print_expr '+' print_expr
| unary_print_expr '−' print_expr
| unary_print_expr bukan_unary_print_expr
| unary_print_expr '~' print_expr
| unary_print_expr NO_MATCH print_expr
| unary_print_expr Di NAME
| unary_print_expr DAN newline_opt print_expr
| unary_print_expr ATAU newline_opt print_expr
| unary_print_expr '?' print_expr ':' print_expr
;
non_unary_print_expr : '(' expr ')'
| '!' print_expr
| non_unary_print_expr '^' print_expr
| non_unary_print_expr '*' print_expr
| non_unary_print_expr '/' print_expr
| non_unary_print_expr '%' print_expr
| non_unary_print_expr '+' print_expr
| non_unary_print_expr '−' print_expr
| non_unary_print_expr non_unary_print_expr
| non_unary_print_expr '~' print_expr
| non_unary_print_expr NO_MATCH print_expr
| non_unary_print_expr Di NAME
| '(' multiple_expr_list ')' Di NAMA
| non_unary_print_expr DAN newline_opt print_expr
| non_unary_print_expr ATAU newline_opt print_expr
| non_unary_print_expr '?' print_expr ':' print_expr
| NOMOR
| RANGKAIAN
| nilai
| SEBELUM
| nilai ICR
| nilai DECR
| Nilai ICR
| Nilai DECR
| nilai POW_ASSIGN print_expr
| nilai MOD_ASSIGN print_expr
| nilai MUL_ASSIGN print_expr
| nilai DIV_ASSIGN print_expr
| nilai ADD_ASSIGN print_expr
| nilai SUB_ASSIGN print_expr
| nilai '=' print_expr
| FUNC_NAME '(' expr_list_opt ')'
/* tidak boleh ada spasi putih sebelum '(' */
| BUILTIN_FUNC_NAME '(' expr_list_opt ')'
| BUILTIN_FUNC_NAME
;
nilai : NAMA
| NAMA '[' expr_list ']'
| '$' ekspr
;
non_unary_input_function : simple_get
| simple_get '<' expr
| non_unary_expr '|' simple_get
;
unary_input_function : unary_expr '|' simple_get
;
simple_get : GETLINE
| Nilai GETLINE
;
newline_opt : /* kosong */
| baris baru_opt NEWLINE
;
Tata bahasa ini memiliki beberapa ambiguitas yang harus diselesaikan sebagai berikut:
* Prioritas dan asosiatif operator harus seperti yang dijelaskan dalam tabel 4-1, Ekspresi
in Penurunan Hak lebih tinggi in Wow.
* Dalam kasus ambiguitas, an lain harus dikaitkan dengan yang paling tepat sebelumnya
if yang akan memenuhi tata bahasa.
* Dalam beberapa konteks, a ('/') yang digunakan untuk mengelilingi ERE juga bisa menjadi
operator divisi. Ini harus diselesaikan sedemikian rupa sehingga di mana pun perpecahan
operator bisa muncul, a diasumsikan sebagai operator pembagian. (Tidak ada
operator divisi unary.)
Setiap ekspresi dalam Wow program harus sesuai dengan aturan prioritas dan asosiatif,
bahkan ketika ini tidak diperlukan untuk menyelesaikan ambiguitas. Misalnya karena '$' memiliki lebih tinggi
didahulukan dari '++', tali "$x++−−" tidak valid Wow ekspresi, meskipun itu
jelas diuraikan oleh tata bahasa sebagai "$(x++)−−".
Satu konvensi yang mungkin tidak jelas dari tata bahasa formal adalah di mana
karakter dapat diterima. Ada beberapa penempatan yang jelas seperti mengakhiri a
pernyataan, dan dapat digunakan untuk melarikan diri karakter antara apapun
token leksikal. Tambahan, karakter tanpa karakter bisa
ikuti koma, kurung kurawal, operator logika AND ("&&"), operator logika ATAU ("||"),
itu do kata kunci, lain kata kunci, dan tanda kurung penutup dari if, untuk, atau sementara
penyataan. Sebagai contoh:
{ mencetak $ 1,
$2 }
Leksikal Konvensi
Konvensi leksikal untuk Wow program, sehubungan dengan tata bahasa sebelumnya, harus
sebagai berikut:
1. Kecuali seperti yang disebutkan, Wow harus mengenali awal token atau pembatas terpanjang yang mungkin
pada titik tertentu.
2. Komentar harus terdiri dari karakter apa pun yang dimulai dengan karakter
dan diakhiri oleh, tetapi tidak termasuk kemunculan berikutnya dari, a . Komentar harus
tidak berpengaruh, kecuali untuk membatasi token leksikal.
3. The akan diakui sebagai token GARIS BARU.
4. A karakter segera diikuti oleh tidak akan berpengaruh.
5. Tokennya STRING akan mewakili konstanta string. Konstanta string harus dimulai dengan
karakternya '"'. Dalam konstanta string, a karakter harus
dianggap memulai urutan pelarian seperti yang ditentukan dalam tabel di Pangkalan
Definisi volume POSIX.1-2008, Bab 5, File dibentuk catatan ('\\', '\A', '\B',
'\F', '\n', '\R', '\T', '\v'). Selain itu, urutan pelarian di tabel 4-2, Melarikan diri
Urutan in Wow akan diakui. SEBUAH tidak akan terjadi dalam string
konstan. Konstanta string harus diakhiri dengan kemunculan pertama yang tidak lolos dari
karakternya '"' setelah yang memulai konstanta string. Nilai dari
string akan menjadi urutan semua karakter yang tidak lolos dan nilai escape
urutan antara, tetapi tidak termasuk, dua pembatas '"' karakter.
6. Tokennya SEBELUM mewakili konstanta ekspresi reguler yang diperluas. Konstanta ERE
akan dimulai dengan karakter. Dalam konstanta ERE, a
karakter harus dianggap memulai urutan pelarian seperti yang ditentukan dalam tabel di
volume Definisi Dasar dari POSIX.1-2008, Bab 5, File dibentuk catatan. di
Selain itu, urutan pelarian di tabel 4-2, Melarikan diri Urutan in Wow seharusnya
dikenali. Aplikasi harus memastikan bahwa a tidak terjadi dalam ERE
konstan. Konstanta ERE harus diakhiri dengan kemunculan pertama yang tidak terelakkan dari
karakter setelah yang memulai konstanta ERE. Reguler diperpanjang
ekspresi yang diwakili oleh konstanta ERE akan menjadi urutan semua yang tidak lolos
karakter dan nilai dari urutan pelarian antara, tetapi tidak termasuk, keduanya
membatasi karakter.
7. A tidak akan berpengaruh, kecuali untuk membatasi token leksikal atau di dalam STRING or
SEBELUM token.
8. Tokennya NOMOR harus mewakili konstanta numerik. Bentuk dan nilai numeriknya harus
baik setara dengan desimal-mengambang-konstan token seperti yang ditentukan oleh ISO C
standar, atau harus berupa urutan angka desimal dan harus dievaluasi sebagai
konstanta bilangan bulat dalam desimal. Selain itu, implementasi dapat menerima konstanta numerik
dengan bentuk dan nilai numerik yang setara dengan heksadesimal-konstanta dan
heksadesimal-mengambang-konstanta token seperti yang ditentukan oleh standar ISO C.
Jika nilainya terlalu besar atau terlalu kecil untuk dapat direpresentasikan (lihat Bagian 1.1.2,
Konsep Berasal dari itu ISO C Standar), perilaku tidak terdefinisi.
9. Urutan garis bawah, angka, dan alfabet dari set karakter portabel
(lihat volume Definisi Dasar dari POSIX.1-2008, Bagian 6.1, Portabel Karakter
set), dimulai dengan atau karakter alfabet, akan dianggap sebagai
kata.
10. Kata-kata berikut adalah kata kunci yang harus dikenali sebagai token individu; itu
nama token sama dengan kata kunci:
MULAI hapus AKHIR fungsi in Printf
istirahat do keluar getline berikutnya kembali
terus lain untuk if mencetak sementara
11. Kata-kata berikut adalah nama fungsi bawaan dan harus diakui sebagai:
token BUILTIN_FUNC_NAME:
atan2 gsub mencatat membagi di bawah puncak
menutup penjualan indeks pertandingan lari cepat substr
sebab int baris persegi sistem
exp panjangnya dosa pasir lebih rendah
Kata kunci dan nama fungsi bawaan yang tercantum di atas dianggap dicadangkan
kata-kata.
12. Tokennya NAMA harus terdiri dari kata yang bukan kata kunci atau nama kata kunci bawaan
fungsi dan tidak diikuti segera (tanpa pembatas) oleh '('
karakter.
13. Tokennya FUNC_NAME harus terdiri dari kata yang bukan merupakan kata kunci atau nama a
fungsi bawaan, segera diikuti (tanpa pembatas) oleh '(' karakter.
The '(' karakter tidak boleh dimasukkan sebagai bagian dari token.
14. Urutan dua karakter berikut harus dikenali sebagai token bernama:
┌─ans───── Chasan XNUMX Choll XNUMXX XNUMX Choll XNUMXX XNUMX Ch XNUMX Ch XNUMX Chs Chsmoc "X XNUMX Choll XNUMX Choll XNUMX Chosansans XNUMX Chs Chsans XNUMX XNUMX XNUMX XNUMX XNUMX Chososansans XNUMX Chsans XNUMX Chsans XNUMXootoot Misstar tolasanasanaskan
│Token Nama │ Urutan │ Token Nama │ Urutan │
├─ans───── Chasan XNUMX Choll XNUMXX XNUMX Choll XNUMXX XNUMX Ch XNUMX Ch XNUMX Chs Chsmoc "X XNUMX Choll XNUMX Choll XNUMX Chosansans XNUMX Chs Chsans XNUMX XNUMX XNUMX XNUMX XNUMX Chososansans XNUMX Chsans XNUMX Chsans XNUMXootoot Misstar tolasanasanaskan
│TAMBAHKAN_ASSIGN += TIDAK_MATCH !~
│SUB_ASSIGN = EQ ==
│MUL_ASSIGN *= LE <=
│DIV_ASSIGN /= GE >=
│MOD_ASSIGN %= NE !=
│POW_ASSIGN ^= INC ++
│OR || │. DEKR │ - │.
│DAN && MENAMBAHKAN >>
└─ans───── Chasan XNUMX Choll XNUMXX XNUMX Choll XNUMXX XNUMX Ch XNUMX Ch XNUMX Chs Chsmoc "X XNUMX Choll XNUMX Choll XNUMX Chosansans XNUMX Chs Chsans XNUMX XNUMX XNUMX XNUMX XNUMX Chososansans XNUMX Chsans XNUMX Chsans XNUMXootoot Misstar tolasanasanaskan
15. Karakter tunggal berikut harus dikenali sebagai token yang namanya adalah:
karakter:
{ } ( ) [ ] , ; + - * % ^ ! > < | ? : " " $ =
Ada ambiguitas leksikal antara token SEBELUM dan tokennya '/' dan DIV_ASSIGN.
Ketika urutan input dimulai dengan karakter dalam konteks sintaksis apa pun di mana
token '/' or DIV_ASSIGN dapat muncul sebagai token berikutnya dalam program yang valid, semakin lama
dua token yang dapat dikenali harus diakui. Dalam sintaksis lainnya
konteks di mana token SEBELUM dapat muncul sebagai token berikutnya dalam program yang valid, token
SEBELUM akan diakui.
EXIT STATUS
Nilai keluar berikut harus dikembalikan:
0 Semua file input berhasil diproses.
>0 Terjadi kesalahan.
Status keluar dapat diubah dalam program dengan menggunakan keluar ekspresi.
KONSEKUENSI OF GALAT
Jika ada fillet operand ditentukan dan file bernama tidak dapat diakses, Wow akan menulis
pesan diagnostik ke kesalahan standar dan berakhir tanpa tindakan lebih lanjut.
Jika program ditentukan oleh salah satu dari program operan atau profil operan bukan
sah Wow program (sebagaimana ditentukan di bagian DESKRIPSI DIPERPANJANG), perilakunya adalah
tidak terdefinisi.
The berikut bagian adalah informatif.
APLIKASI PENGGUNAAN
The indeks, panjangnya, pertandingan, dan substr fungsi tidak boleh disamakan dengan yang serupa
fungsi dalam standar ISO C; itu Wow versi berurusan dengan karakter, sedangkan ISO C
kesepakatan standar dengan byte.
Karena operasi penggabungan diwakili oleh ekspresi yang berdekatan daripada an
operator eksplisit, sering kali perlu menggunakan tanda kurung untuk menegakkan yang tepat
prioritas evaluasi.
CONTOH
The Wow program yang ditentukan dalam baris perintah paling mudah ditentukan dalam single-
kutipan (misalnya, 'program') untuk aplikasi yang menggunakan sh, Karena Wow program umumnya
berisi karakter yang khusus untuk shell, termasuk tanda kutip ganda. Dalam kasus
dimana Wow program berisi karakter tanda kutip tunggal, biasanya paling mudah untuk ditentukan
sebagian besar program sebagai string dalam tanda kutip tunggal yang digabungkan oleh shell dengan tanda kutip
karakter tanda kutip tunggal. Sebagai contoh:
Wow '/'\''/ { mencetak "mengutip:", $0 }'
mencetak semua baris dari input standar yang berisi karakter tanda kutip tunggal, diawali
dengan mengutip:.
Berikut ini adalah contoh sederhana Wow program:
1. Tulis ke output standar semua baris input yang bidang 3 lebih besar dari 5:
$3 > 5
2. Tulis setiap baris kesepuluh:
(NR % 10) == 0
3. Tulis baris apa pun dengan substring yang cocok dengan ekspresi reguler:
/(G|D)(2[0−9][[:alfa:]]*)/
4. Cetak baris apa pun dengan substring yang mengandung a 'G' or 'D', diikuti oleh urutan
angka dan karakter. Contoh ini menggunakan kelas karakter angka dan alfa untuk mencocokkan
digit independen bahasa dan karakter alfabet masing-masing:
/(G|D)([[:digit:][:alfa:]]*)/
5. Tulis baris mana pun di mana bidang kedua cocok dengan ekspresi reguler dan yang keempat
lapangan tidak:
$2 " " /xyz/ && $4 ! " " /xyz/
6. Tulis baris apa saja yang kolom kedua berisi a :
$2 " " /\\/
7. Tulis baris apa saja yang kolom kedua berisi a . Perhatikan bahwa
-escapes ditafsirkan dua kali; sekali dalam pemrosesan leksikal string
dan sekali dalam memproses ekspresi reguler:
$2 " " "\\\\"
8. Tulis kolom kedua hingga terakhir dan terakhir di setiap baris. Pisahkan bidang dengan a
:
{OFS=":";cetak $(NF−1), $NF}
9. Tulis nomor baris dan jumlah kolom di setiap baris. Tiga senar
mewakili nomor baris, the , dan jumlah bidang digabungkan
dan string itu ditulis ke output standar:
{mencetak NR "" nf}
10. Tulis baris lebih dari 72 karakter:
panjang($0) > 72
11. Tulis dua bidang pertama dalam urutan yang berlawanan dipisahkan oleh FSO:
{ mencetak $ 2, $1 }
12. Sama, dengan kolom input dipisahkan oleh a atau dan karakter, atau
kedua:
MULAI { FS = ",[ \t]*|[ \t]+" }
{ mencetak $ 2, $1 }
13. Jumlahkan kolom pertama, cetak jumlah, dan rata-rata:
{s += $1 }
AKHIR {mencetak "jumlah is ", s, " rata-rata adalah", s/NR}
14. Tulis bidang dalam urutan terbalik, satu per baris (banyak baris keluar untuk setiap baris masuk):
{ untuk (i = tidak; i > 0; i) mencetak $i }
15. Tulis semua baris di antara kemunculan string awal dan berhenti:
/Mulailah/, /berhenti/
16. Tulis semua baris yang bidang pertamanya berbeda dari yang sebelumnya:
$1 != prev { cetak; prev = $1 }
17. Simulasikan gema:
MULAI {
untuk (i = 1; i < ARGC; ++saya)
printf("%s%s", ARGV[i], i==ARGC−1?"\n":" ")
}
18. Tulis awalan jalur yang terdapat dalam PATH variabel lingkungan, satu per baris:
MULAI {
n = membagi (LINGKUNGAN["JALAN"], jalan, ":")
untuk (i = 1; i <= n; ++saya)
mencetak jalan[i]
}
19. Jika ada file bernama memasukkan berisi header halaman formulir: Halaman #
dan file bernama program yang berisi:
/Halaman/ { $2 = n++; }
{ mencetak }
lalu baris perintah:
Wow f program n = 5 memasukkan
mencetak file memasukkan, pengisian nomor halaman dimulai dari 5.
ALASAN
Deskripsi ini didasarkan pada yang baru Wow, ``nawk'', (lihat referensi The AWK
Pemrograman Bahasa), yang memperkenalkan sejumlah fitur baru ke sejarah Wow:
1. Kata kunci baru: hapus, do, fungsi, kembali
2. Fungsi bawaan baru: atan2, menutup penjualan, sebab, gsub, pertandingan, baris, dosa, pasir, di bawah, sistem
3. Variabel standar baru: FNR, ARGC, ARGV, MULAI, PANJANG, SUBSEPS
4. Operator ekspresi baru: ?, :, ,, ^
5. Itu FS variabel dan argumen ketiga untuk membagi, sekarang diperlakukan sebagai perpanjangan reguler
ekspresi.
6. Operator didahulukan, diubah agar lebih cocok dengan bahasa C. Dua contoh
kode yang beroperasi secara berbeda adalah:
sementara ( n /= 10 > 1) ...
if (!" wk" ~ /bwk/) ...
Beberapa fitur telah ditambahkan berdasarkan implementasi yang lebih baru dari Wow:
* Beberapa contoh dari f profil diizinkan.
* Opsi baru v tugas.
* Variabel standar baru MENGEPUNG.
* Fungsi bawaan baru puncak dan lebih rendah.
* Lebih banyak kemampuan pemformatan ditambahkan ke Printf agar sesuai dengan standar ISO C.
Secara keseluruhan Wow sintaks selalu didasarkan pada bahasa C, dengan beberapa fitur dari
bahasa perintah shell dan sumber lainnya. Karena itu, tidak sepenuhnya
kompatibel dengan bahasa lain, yang menyebabkan kebingungan bagi beberapa pengguna. Bukan itu
maksud dari pengembang standar untuk mengatasi masalah tersebut. Beberapa relatif kecil
perubahan ke arah membuat bahasa lebih kompatibel dengan standar ISO C dibuat; paling
perubahan ini didasarkan pada perubahan serupa dalam implementasi baru-baru ini, seperti yang dijelaskan
di atas. Masih ada beberapa konvensi bahasa C yang tidak Wow. Salah satunya
yang menonjol adalah operator, yang biasanya digunakan untuk menentukan multiple
ekspresi dalam bahasa C untuk penyataan. Juga, ada berbagai tempat di mana Wow is
lebih ketat daripada bahasa C mengenai jenis ekspresi yang dapat digunakan dalam
konteks yang diberikan. Keterbatasan ini disebabkan oleh fitur yang berbeda yang Wow bahasa
memang menyediakan.
Ekspresi reguler dalam Wow telah diperpanjang agak dari implementasi historis ke
menjadikannya superset murni dari ekspresi reguler yang diperluas, seperti yang didefinisikan oleh POSIX.1-2008 (lihat
volume Definisi Dasar dari POSIX.1-2008, Bagian 9.4, luas Reguler Ekspresi).
Ekstensi utama adalah fitur internasionalisasi dan ekspresi interval. Historis
implementasi dari Wow telah lama mendukung -escape sequence sebagai ekstensi untuk
ekspresi reguler yang diperluas, dan ekstensi ini telah dipertahankan meskipun ada inkonsistensi
dengan utilitas lainnya. Jumlah urutan pelarian yang dikenali di kedua reguler diperpanjang
ekspresi dan string bervariasi (umumnya meningkat seiring waktu) di antara implementasi.
Himpunan yang ditentukan oleh POSIX.1-2008 mencakup sebagian besar urutan yang diketahui didukung oleh popular
implementasi dan dengan standar ISO C. Satu urutan yang tidak didukung adalah
nilai heksadesimal lolos dimulai dengan '\x'. Ini akan memungkinkan nilai-nilai yang diekspresikan dalam more
dari 9 bit untuk digunakan dalam Wow seperti pada standar ISO C. Namun, karena sintaks ini
memiliki panjang non-deterministik, itu tidak mengizinkan karakter berikutnya menjadi a
angka heksadesimal. Keterbatasan ini dapat diatasi dalam bahasa C dengan menggunakan
penggabungan string leksikal. Dalam Wow bahasa, penggabungan juga bisa menjadi solusi
untuk string, tetapi tidak untuk ekspresi reguler yang diperluas (baik token ERE leksikal atau
string yang digunakan secara dinamis sebagai ekspresi reguler). Karena keterbatasan ini, fitur
belum ditambahkan ke POSIX.1-2008.
Ketika variabel string digunakan dalam konteks di mana ekspresi reguler yang diperluas biasanya
muncul (di mana token leksikal ERE digunakan dalam tata bahasa) string tidak mengandung
harfiah karakter.
Beberapa versi Wow izinkan formulir:
fungsi nama (arg, ... ) { Laporan }
Ini telah ditinggalkan oleh penulis bahasa, yang meminta agar tidak
ditentukan.
Implementasi historis dari Wow menghasilkan kesalahan jika berikutnya pernyataan dieksekusi dalam
MULAI tindakan, dan penyebab Wow untuk mengakhiri jika a berikutnya pernyataan dieksekusi dalam AKHIR tindakan.
Perilaku ini belum didokumentasikan, dan diyakini tidak perlu untuk
menstandarisasikannya.
Spesifikasi konversi antara string dan nilai numerik jauh lebih detail
daripada dalam dokumentasi implementasi historis atau dalam referensi The AWK
Pemrograman Bahasa. Meskipun sebagian besar perilaku dirancang untuk menjadi intuitif,
detail diperlukan untuk memastikan perilaku yang kompatibel dari implementasi yang berbeda. Ini
sangat penting dalam ekspresi relasional karena jenis operan
menentukan apakah string atau numerik perbandingan dilakukan. Dari sudut pandang
pengembang aplikasi, biasanya cukup untuk mengharapkan perilaku intuitif dan memaksa
konversi (dengan menambahkan nol atau menggabungkan string nol) ketika jenis ekspresi
jelas tidak sesuai dengan yang dibutuhkan. Tujuannya adalah untuk menentukan sejarah
praktek di hampir semua kasus. Satu-satunya pengecualian adalah bahwa, dalam implementasi historis,
variabel dan konstanta mempertahankan nilai string dan numerik setelah nilai aslinya
diubah oleh penggunaan apa pun. Ini berarti bahwa mereferensikan variabel atau konstanta dapat memiliki
efek samping yang tidak terduga. Misalnya, dengan implementasi historis berikut ini
program:
{
a = "+2"
b = 2
if (NR % 2)
c = a + b
if (a == b)
mencetak "numerik perbandingan"
lain
mencetak "rangkaian perbandingan"
}
akan melakukan perbandingan numerik (dan perbandingan numerik keluaran) untuk setiap nomor ganjil
baris, tetapi lakukan perbandingan string (dan perbandingan string keluaran) untuk setiap genap
garis bernomor. POSIX.1-2008 memastikan bahwa perbandingan akan numerik jika perlu. Dengan
implementasi historis, program berikut:
MULAI {
OFMT = "%e"
mencetak 3.14
OFMT = "%F"
mencetak 3.14
}
akan mengeluarkan "3.140000e+00" dua kali, karena yang kedua mencetak pernyataan konstanta
"3.14" akan memiliki nilai string dari konversi sebelumnya. POSIX.1-2008 mensyaratkan bahwa
keluaran kedua mencetak pernyataan menjadi "3.140000". Perilaku sejarah
implementasi dipandang terlalu tidak intuitif dan tidak dapat diprediksi.
Ditunjukkan bahwa dengan aturan yang terdapat dalam draft awal, script berikut:
tidak akan mencetak apa pun:
MULAI {
kamu[1.5] = 1
OFMT = "%e"
mencetak kamu[1.5]
}
Oleh karena itu, variabel baru KONVFMT, diperkenalkan. Itu OFMT variabel sekarang dibatasi untuk
mempengaruhi konversi keluaran angka menjadi string dan KONVFMT digunakan untuk internal
konversi, seperti perbandingan atau pengindeksan array. Nilai defaultnya sama dengan itu
untuk OFMT, jadi kecuali ada program yang berubah KONVFMT (yang tidak akan dilakukan oleh program sejarah), itu
akan menerima perilaku historis yang terkait dengan konversi string internal.
POSIX Wow konvensi leksikal dan sintaksis ditentukan lebih formal daripada di lainnya
sumber. Sekali lagi tujuannya adalah untuk menentukan praktik sejarah. Satu konvensi yang mungkin
tidak jelas dari tata bahasa formal seperti dalam deskripsi verbal lainnya adalah di mana
karakter dapat diterima. Ada beberapa penempatan yang jelas seperti mengakhiri a
pernyataan, dan dapat digunakan untuk melarikan diri karakter antara apapun
token leksikal. Tambahan, karakter tanpa karakter bisa
ikuti koma, kurung kurawal, operator logika AND ("&&"), operator logika OR
("||"), Yang do kata kunci, lain kata kunci, dan tanda kurung penutup dari if, untuk, atau
sementara penyataan. Sebagai contoh:
{ mencetak $ 1,
$2 }
Persyaratan itu Wow tambahkan jejak ke teks argumen program adalah untuk
menyederhanakan tata bahasa, membuatnya cocok dengan file teks dalam bentuk. Tidak ada cara untuk
aplikasi atau test suite untuk menentukan apakah literal ditambahkan atau apakah Wow
hanya bertindak seolah-olah itu terjadi.
POSIX.1-2008 membutuhkan beberapa perubahan dari implementasi historis untuk mendukung
penginternasionalan. Mungkin yang paling halus adalah penggunaan titik desimal
karakter, ditentukan oleh LC_NUMERIC kategori lokal, dalam representasi dari
bilangan floating-point. Karakter khusus lokal ini digunakan dalam mengenali numerik
input, dalam mengonversi antara string dan nilai numerik, dan dalam memformat output.
Namun, terlepas dari lokalnya, karakter (karakter titik desimal dari
POSIX locale) adalah karakter titik desimal yang dikenali dalam pemrosesan Wow program
(termasuk tugas dalam argumen baris perintah). Ini pada dasarnya adalah konvensi yang sama
seperti yang digunakan dalam standar ISO C. Perbedaannya adalah bahwa bahasa C mencakup
setlokal() fungsi, yang mengizinkan aplikasi untuk mengubah lokalnya. Karena ini
kapabilitas, aplikasi C mulai mengeksekusi dengan lokalnya disetel ke lokal C, dan hanya
dieksekusi di lokal yang ditentukan lingkungan setelah panggilan eksplisit ke setlokal,
Namun, menambahkan fitur baru yang begitu rumit ke Wow bahasa dipandang sebagai
tidak sesuai untuk POSIX.1-2008. Hal ini dimungkinkan untuk mengeksekusi Wow program secara eksplisit dalam
lokal yang diinginkan dengan mengatur lingkungan di shell.
Perilaku tidak terdefinisi yang dihasilkan dari NUL dalam ekspresi reguler yang diperluas memungkinkan masa depan
ekstensi untuk GNU melongo program untuk memproses data biner.
Perilaku dalam kasus tidak valid Wow program (termasuk leksikal, sintaksis, dan
kesalahan semantik) tidak terdefinisi karena dianggap terlalu membatasi implementasi
untuk menentukan. Dalam kebanyakan kasus kesalahan tersebut dapat diharapkan untuk menghasilkan diagnostik dan non-
status keluar nol. Namun, beberapa implementasi dapat memilih untuk memperluas bahasa dengan cara
yang menggunakan konstruksi tidak valid tertentu. Konstruksi tidak valid lainnya mungkin dianggap
layak untuk peringatan, tetapi sebaliknya menyebabkan beberapa perilaku yang wajar. Masih konstruksi lainnya
mungkin sangat sulit untuk dideteksi dalam beberapa implementasi. Juga, implementasi yang berbeda
mungkin mendeteksi kesalahan yang diberikan selama penguraian awal program (sebelum membaca
file input) sementara yang lain mungkin mendeteksinya saat menjalankan program setelah membaca beberapa
memasukkan. Pelaksana harus menyadari bahwa mendiagnosis kesalahan sedini mungkin dan
menghasilkan diagnostik yang berguna dapat memudahkan debugging aplikasi, dan dengan demikian membuat
implementasi lebih bermanfaat.
Perilaku yang tidak ditentukan dari penggunaan multi-karakter RS nilai adalah untuk memungkinkan kemungkinan masa depan
ekstensi berdasarkan ekspresi reguler yang diperluas yang digunakan untuk pemisah rekaman. Historis
implementasi mengambil karakter pertama dari string dan mengabaikan yang lain.
Perilaku tidak ditentukan ketika membagi(string,susunan, ) digunakan adalah untuk memungkinkan masa depan yang diusulkan
ekstensi yang akan membagi string menjadi array karakter individu.
Dalam konteks getline fungsi, argumen yang sama bagusnya untuk prioritas yang berbeda
dari | dan < operator dapat dibuat. Praktek sejarah adalah bahwa:
getline < "A" "B"
diuraikan sebagai:
( getline < "A" ) "B"
meskipun banyak yang berpendapat bahwa maksudnya adalah file itu ab harus dibaca. Namun:
getline < "x" + 1
mem-parsing sebagai:
getline < ( "x" + 1 )
Masalah serupa terjadi dengan | versi getline, terutama dalam kombinasi dengan $.
Sebagai contoh:
$"gema hai" | getline
(Situasi ini sangat bermasalah ketika digunakan dalam mencetak pernyataan, dimana
|getline bagian mungkin merupakan pengalihan dari mencetak.)
Karena dalam kebanyakan kasus konstruksi seperti itu tidak (atau setidaknya tidak boleh) digunakan (karena mereka
memiliki ambiguitas alami yang tidak ada penguraian konvensional), artinya ini
konstruksi telah dibuat secara eksplisit tidak ditentukan. (Efeknya adalah kesesuaian
aplikasi yang mengalami masalah harus diberi tanda kurung untuk menyelesaikan ambiguitas.) Ada
tampaknya sedikit jika ada penggunaan yang sebenarnya dari konstruksi tersebut.
Tata bahasa dapat ditulis yang akan menyebabkan kesalahan dalam keadaan ini. Di mana
kompatibilitas mundur bukanlah pertimbangan besar, pelaksana mungkin ingin menggunakan
tata bahasa.
Beberapa implementasi historis memungkinkan beberapa fungsi bawaan dipanggil tanpa
daftar argumen, hasilnya menjadi daftar argumen default yang dipilih dalam beberapa ``masuk akal''
cara. Penggunaan panjangnya sebagai sinonim untuk panjang($0) adalah satu-satunya dari bentuk-bentuk ini yang
dianggap dikenal luas atau digunakan secara luas; bentuk khusus ini didokumentasikan dalam berbagai
tempat (misalnya, tempat paling bersejarah Wow halaman referensi, meskipun tidak dalam referensi
The AWK Pemrograman Bahasa) sebagai praktik yang sah. Dengan pengecualian ini, default
daftar argumen selalu tidak didokumentasikan dan didefinisikan secara samar, dan itu tidak sama sekali
jelas bagaimana (atau jika) mereka harus digeneralisasi ke fungsi yang ditentukan pengguna. Mereka menambahkan tidak berguna
fungsionalitas dan menghalangi kemungkinan ekstensi di masa mendatang yang mungkin perlu memberi nama fungsi
tanpa memanggil mereka. Tidak membakukan mereka tampaknya tentu saja paling sederhana. Standar
pengembang menganggap itu panjangnya pantas mendapatkan perlakuan khusus, bagaimanapun, karena telah
didokumentasikan di masa lalu dan melihat kemungkinan penggunaan substansial dalam program sejarah.
Oleh karena itu, penggunaan ini telah dibuat sah, tetapi Edisi 5 menghapus yang usang
penandaan untuk implementasi yang sesuai dengan XSI dan banyak aplikasi yang sesuai lainnya
tergantung pada fitur ini.
In di bawah dan gsub, Jika membalas adalah string literal (token leksikal STRING), lalu dua
berurutan karakter harus digunakan dalam string untuk memastikan satu
akan mendahului ketika string yang dihasilkan dilewatkan ke
fungsi. (Misalnya, untuk menentukan satu literal dalam string pengganti, gunakan
gsub(SEBELUM, "\\&").)
Secara historis, satu-satunya karakter khusus di membalas argumen dari di bawah dan gsub string
fungsi adalah ('&') karakter dan mendahuluinya dengan
karakter digunakan untuk mematikan makna khususnya.
Deskripsi dalam standar ISO POSIX-2:1993 memperkenalkan perilaku sedemikian rupa sehingga:
karakter adalah karakter khusus lainnya dan tidak ditentukan apakah ada
adalah karakter khusus lainnya. Deskripsi ini memperkenalkan beberapa portabilitas
masalah, beberapa di antaranya dijelaskan di bawah ini, dan karenanya telah diganti dengan lebih banyak
deskripsi sejarah. Beberapa masalah tersebut antara lain:
* Secara historis, untuk membuat string pengganti, skrip dapat menggunakan gsub(SEBELUM, "\\&"),
tetapi dengan kata-kata standar ISO POSIX-2: 1993, itu perlu untuk menggunakan gsub(SEBELUM,
"\\\\&"). Itu karakter digandakan di sini karena semua literal string adalah
tunduk pada analisis leksikal, yang akan mengurangi setiap pasangan karakter untuk
Tunggal sebelum diteruskan ke gsub.
* Karena tidak ditentukan apa karakter khusus itu, untuk skrip portabel untuk
menjamin bahwa karakter dicetak secara harfiah, setiap karakter harus didahului
dengan . (Misalnya, skrip portabel harus menggunakan gsub(SEBELUM, "\\Hai") ke
menghasilkan string pengganti "Hai".)
Deskripsi untuk perbandingan dalam standar ISO POSIX-2:1993 tidak dijelaskan dengan benar
praktik historis karena cara string numerik dibandingkan sebagai angka. Itu
aturan saat ini menyebabkan kode berikut:
if (0 == "000")
mencetak "aneh, tapi benar"
lain
mencetak "bukan benar"
untuk melakukan perbandingan numerik, menyebabkan if untuk berhasil. Itu harus jelas secara intuitif
bahwa ini adalah perilaku yang salah, dan memang, tidak ada implementasi historis dari Wow sebenarnya
berperilaku seperti ini.
Untuk mengatasi masalah ini, definisi dari numerik string ditingkatkan untuk memasukkan hanya mereka
nilai yang diperoleh dari keadaan tertentu (kebanyakan sumber eksternal) di mana tidak
mungkin untuk menentukan dengan jelas apakah nilainya dimaksudkan sebagai string atau a
numerik.
Variabel yang ditetapkan ke string numerik juga harus diperlakukan sebagai string numerik.
(Misalnya, gagasan string numerik dapat disebarkan di seluruh tugas.) In
perbandingan, semua variabel yang memiliki nilai yang tidak diinisialisasi harus diperlakukan sebagai numerik
operan mengevaluasi ke nilai numerik nol.
Variabel yang tidak diinisialisasi mencakup semua jenis variabel termasuk skalar, elemen array,
dan bidang. Definisi nilai yang tidak diinisialisasi dalam Variabel dan Khusus Variabel is
diperlukan untuk menggambarkan nilai yang ditempatkan pada variabel yang tidak diinisialisasi dan pada bidang yang
sah (misalnya, < $NF) tetapi tidak memiliki karakter di dalamnya dan untuk menggambarkan bagaimana ini
variabel yang akan digunakan dalam perbandingan. Bidang yang valid, seperti $1, yang tidak memiliki karakter
di dalamnya dapat diperoleh dari jalur input "\t\t" ketika FS='\t'. Secara historis,
perbandingan ($110) dilakukan secara numerik setelah mengevaluasi $1 ke nilai nol.
Frase ``... juga harus memiliki nilai numerik dari string numerik'' telah dihapus
dari beberapa bagian standar ISO POSIX-2:1993 karena menentukan yang tidak perlu
rincian implementasi. POSIX.1-2008 tidak perlu menentukan bahwa objek-objek ini
diberikan dua nilai yang berbeda. Hanya perlu untuk menentukan bahwa objek-objek ini dapat
mengevaluasi dua nilai yang berbeda tergantung pada konteksnya.
Implementasi historis dari Wow tidak mengurai bilangan bulat heksadesimal atau konstanta mengambang
'like' "0x" dan "0xap0". Karena kekhilafan, edisi 2001 hingga 2004 ini
dukungan standar yang diperlukan untuk konstanta mengambang heksadesimal. Hal ini disebabkan oleh
mengacu kepada atof(). Versi standar ini memungkinkan tetapi tidak mengharuskan
implementasi untuk digunakan atof() dan termasuk deskripsi tentang bagaimana bilangan floating-point itu
diakui sebagai alternatif untuk mencocokkan perilaku historis. Maksud dari perubahan ini adalah untuk
memungkinkan implementasi untuk mengenali konstanta floating-point sesuai dengan
Standar ISO/IEC 9899:1990 atau standar ISO/IEC 9899:1999, dan untuk mengizinkan (tetapi tidak memerlukan)
implementasi untuk mengenali konstanta bilangan bulat heksadesimal.
Implementasi historis dari Wow tidak mendukung infinity floating-point dan NaNs di
numerik string; misalnya, "−INF" dan "NaN". Namun, implementasi yang menggunakan atof() atau
jalan() berfungsi untuk melakukan konversi mengambil dukungan untuk nilai-nilai ini jika mereka menggunakan a
ISO/IEC 9899:1999 versi standar fungsi, bukan standar ISO/IEC 9899:1990
Versi: kapan. Karena kekhilafan, edisi 2001 hingga 2004 dari standar ini tidak
izinkan dukungan untuk infinity dan NaN, tetapi dalam revisi ini dukungan diizinkan (tetapi tidak
diperlukan). Ini adalah perubahan diam-diam pada perilaku Wow program; misalnya di
POSIX melokalkan ekspresi:
("-INF" + 0 < 0)
sebelumnya memiliki nilai 0 karena "−INF" dikonversi ke 0, tetapi sekarang mungkin memiliki nilai 0 atau
1.
MASA DEPAN ARAH
Tidak ada.
Gunakan awkposix online menggunakan layanan onworks.net