Sunday 9 July 2017

Contoh Perl Moving Average


Rrdgraphexamples Pergeseran data ke depan satu minggu (604800 detik) Jika fungsi khusus RRA ada untuk mendeteksi perilaku menyimpang, mereka dapat digunakan untuk menghasilkan grafik deret waktu dengan pita kepercayaan dan kegagalan. Contoh ini menghasilkan grafik rangkaian data dengan warna biru (LINE2 dengan sumber data virtual skala), batas kepercayaan pada sumber data virtual merah (scaledupper dan scaledlower virtual), dan potensi kegagalan (yaitu perilaku menyimpang yang menyimpang) yang ditandai dengan garis kuning vertikal Sumber data gagal). Data mentahnya berasal dari RRA RATA. Resolusi terbaik dari rangkaian waktu yang diamati (satu titik data terkonsolidasi per titik data primer). Nilai yang diprediksi (atau dihaluskan) disimpan di RRA HWPREDICT. Nilai deviasi yang diprediksi (berpikir standar deviasi) disimpan di RRA DEVPREDICT. Akhirnya, FAILURES RRA berisi indikator, dengan 1 menunjukkan potensi kegagalan. Semua data dikompres ke bit (bukan Octets) dengan mengalikan dengan 8. Batas kepercayaan dihitung dengan offset 2 penyimpangan baik di atas dan di bawah nilai yang diprediksi (CDEFs atas dan bawah). Garis vertikal menunjukkan potensi kegagalan digambarkan melalui elemen grafik TICK, yang mengubah nilai non-nol dalam RRA menjadi tanda centang. Berikut argumen sumbu-fraksi 1,0 berarti tanda centang membentang sepanjang sumbu y, dan karenanya menjadi garis vertikal pada grafik. Pilihan 2 penyimpangan (faktor penskalaan) sesuai dengan standar yang digunakan secara internal oleh FAILURES RRA. Jika nilai internal diubah (lihat rrdtune), perintah grafik ini harus diubah agar konsisten. Perintah graph rrdtool dirancang untuk merencanakan data pada resolusi temporal tertentu, terlepas dari resolusi sebenarnya dari data dalam file RRD. Hal ini dapat menghadirkan masalah bagi fungsi konsolidasi khusus yang menjaga pemetaan satu-satu antara titik data primer dan titik data terkonsolidasi. Jika sebuah grafik bersikeras melihat isi RRA ini pada skala temporal yang kasar, perintah grafik mencoba melakukan sesuatu yang cerdas, namun pita kepercayaan dan kegagalan tidak lagi memiliki arti yang sama dan mungkin menyesatkan. Rrdgraph memberikan gambaran tentang bagaimana grafik rrdtool bekerja. Rrdgraphdata menjelaskan DEF, CDEF dan VDEF secara rinci. Rrdgraphrpn menggambarkan bahasa RPN yang digunakan dalam pernyataan xDEF. Halaman rrdgraphgraph menjelaskan semua fungsi grafik dan cetak. Program oleh Tobias Oetiker 60tobioetiker. ch62 Halaman manual ini oleh Alex van den Bogaerdt 60alexvandenbogaerdt. nl62 dengan koreksi dan penambahan oleh beberapa orang Bab ini mengenalkan Anda pada konsep di balik referensi modul, paket, dan kelas Perl. Ini juga menunjukkan kepada Anda bagaimana membuat beberapa contoh modul. Modul Perl adalah seperangkat kode Perl yang berfungsi seperti perpustakaan fungsi panggilan. Modul istilah di Perl identik dengan paket kata. Paket adalah fitur Perl 4, sedangkan modul lazim di Perl 5. Anda dapat menyimpan semua kode Perl yang dapat digunakan kembali yang spesifik untuk satu set tugas dalam modul Perl. Oleh karena itu, semua fungsi yang berkaitan dengan satu jenis tugas terkandung dalam satu file. Lebih mudah untuk membangun sebuah aplikasi pada blok modular ini. Oleh karena itu, kata modul berlaku sedikit lebih dari sekedar paket. Heres pengenalan singkat untuk modul. Topik-topik tertentu di bagian ini akan dibahas secara rinci sepanjang sisa buku ini. Bacalah paragraf berikut dengan seksama untuk mendapatkan gambaran umum tentang apa yang ada di depan saat Anda menulis dan menggunakan modul Anda sendiri. Yang membingungkan adalah modul dan paket persyaratan digunakan secara bergantian dalam semua dokumentasi Perl, dan kedua istilah ini berarti hal yang sama. Jadi saat membaca dokumen Perl, pikirkan saja quotpackagequot saat melihat quotmodulequot dan sebaliknya. Jadi, apa premis untuk menggunakan modul Nah, modul ada untuk mengemas (maafkan punah) variabel, simbol, dan item data yang saling terkait. Misalnya, menggunakan variabel global dengan nama yang sangat umum seperti k. J. Atau saya dalam sebuah program umumnya bukan ide bagus. Juga, penghitung loop, i. Harus diizinkan untuk bekerja secara independen dalam dua bagian kode yang berbeda. Mendeklarasikan saya sebagai variabel global dan kemudian menambahkannya dari dalam subrutin akan menciptakan masalah yang tidak terkelola dengan kode aplikasi Anda karena subrutin mungkin dipanggil dari dalam satu lingkaran yang juga menggunakan variabel yang disebut i. Penggunaan modul di Perl memungkinkan variabel dengan nama yang sama dibuat di tempat yang berbeda dan berbeda dalam program yang sama. Simbol yang ditentukan untuk variabel Anda disimpan dalam array asosiatif, disebut sebagai tabel simbol. Tabel simbol ini unik untuk sebuah paket. Oleh karena itu, variabel dengan nama yang sama dalam dua paket yang berbeda dapat memiliki nilai yang berbeda. Setiap modul memiliki tabel simbol tersendiri dari semua simbol yang dinyatakan di dalamnya. Tabel simbol pada dasarnya mengisolasi nama sinonim dalam satu modul dari modul lainnya. Tabel simbol mendefinisikan namespace. Yaitu, ruang untuk nama variabel independen ada di dalamnya. Dengan demikian, penggunaan modul, masing-masing dengan tabel simbolnya sendiri, mencegah sebuah variabel dinyatakan dalam satu bagian dari menimpa nilai variabel lain dengan nama yang sama yang dideklarasikan di tempat lain dalam keadaan sama. program. Sebagai soal fakta, semua variabel dalam Perl termasuk dalam paket. Variabel dalam program Perl termasuk dalam paket utama. Semua paket lain dalam program Perl keduanya bersarang di dalam paket utama ini atau ada pada tingkat yang sama. Ada beberapa variabel yang benar-benar global, seperti sinyal handler array SIG. Yang tersedia untuk semua modul lain dalam program aplikasi dan tidak dapat diisolasi melalui ruang nama. Hanya pengidentifikasi variabel yang dimulai dengan huruf atau garis bawah yang disimpan dalam tabel simbol modul. Semua simbol lainnya, seperti nama STDIN. STDOUT STDERR. ARGV ARGVOUT ENV. Inc. Dan SIG terpaksa berada dalam paket utama. Switching antar paket hanya mempengaruhi ruang nama. Semua yang Anda lakukan saat Anda menggunakan satu paket atau lainnya adalah menyatakan tabel simbol mana yang akan digunakan sebagai tabel simbol default untuk pencarian nama variabel. Hanya variabel dinamis yang dipengaruhi oleh penggunaan tabel simbol. Variabel yang dinyatakan dengan penggunaan kata kunci saya masih terselesaikan dengan blok kode yang kebetulan ada dan tidak dirujuk melalui tabel simbol. Sebenarnya, ruang lingkup deklarasi paket tetap aktif hanya di dalam blok kode yang dideklarasikan di dalamnya. Oleh karena itu, jika Anda mengganti tabel simbol dengan menggunakan paket dalam subrutin, tabel simbol asli berlaku saat panggilan dibuat akan dipulihkan. Saat subrutin kembali. Tabel simbol switching hanya mempengaruhi pencarian default dari nama variabel dinamis. Anda masih dapat secara eksplisit merujuk ke variabel, menangani file, dan seterusnya dalam paket tertentu dengan menambahkan paketName. Ke nama variabel Anda melihat konteks paket ketika menggunakan referensi di Bab 3. Konteks paket hanya menyiratkan penggunaan tabel simbol oleh penerjemah Perl untuk menyelesaikan nama variabel dalam sebuah program. Dengan mengganti tabel simbol, Anda mengubah konteks paket. Modul dapat disarangkan dalam modul lain. Modul bersarang dapat menggunakan variabel dan fungsi modul yang disarangkan di dalamnya. Untuk modul bersarang, Anda harus menggunakan moduleName. NestedModuleName dan sebagainya. Menggunakan kolon ganda (::) sama artinya dengan menggunakan kutipan balik (). Namun, kolon ganda adalah cara pengalamatan yang disukai di masa mendatang dalam modul. Penjelasan eksplisit tentang variabel modul selalu dilakukan dengan referensi lengkap. Misalnya, Anda punya modul Investasi. Yang merupakan paket default yang digunakan, dan Anda ingin alamat modul lain, Bonds. Yang bersarang di dalam modul Investasi. Dalam hal ini, Anda tidak dapat menggunakan Bond ::. Sebagai gantinya, Anda harus menggunakan Investment :: Bond :: untuk menangani variabel dan fungsi dalam modul Bond. Menggunakan Bond :: akan menyiratkan penggunaan paket Bond yang bersarang di dalam modul utama dan tidak berada dalam modul Investment. Tabel simbol untuk modul sebenarnya tersimpan dalam array asosiatif dari nama modul yang ditambahkan dua titik dua. Tabel simbol untuk modul yang disebut Bond akan disebut sebagai array asosiatif Bond ::. Nama untuk tabel simbol untuk modul utama adalah main ::. Dan bahkan bisa dipersingkat menjadi ::. Demikian pula, semua paket bersarang memiliki simbol yang tersimpan dalam array asosiatif dengan titik dua ganda yang memisahkan setiap tingkat nesting. Misalnya, dalam modul Obligasi yang bersarang di dalam modul Investasi, susunan asosiatif untuk simbol dalam modul Obligasi akan diberi nama Investment :: Bond ::. Sebuah typeglob benar-benar tipe global untuk nama simbol. Anda bisa melakukan operasi aliasing dengan menugaskan typeglob. Satu atau lebih entri dalam array asosiatif untuk simbol akan digunakan saat sebuah tugas melalui typeglob digunakan. Nilai sebenarnya di setiap entri array asosiatif adalah apa yang Anda maksud ketika Anda menggunakan notasi variableName. Jadi, ada dua cara untuk merujuk ke nama variabel dalam sebuah paket: Investasi :: uang Investasi :: tagihan Pada metode pertama, Anda mengacu pada variabel melalui referensi typeglob. Penggunaan tabel simbol, Investasi ::. Tersirat disini, dan Perl akan mengoptimalkan pencarian simbol uang dan tagihan. Ini adalah cara yang lebih cepat dan lebih disukai untuk menangani simbol. Metode kedua menggunakan pencarian untuk nilai variabel yang ditangani oleh uang dan tagihan dalam array asosiatif yang digunakan untuk simbol, Investasi :: secara eksplisit. Pencarian ini akan dilakukan secara dinamis dan tidak akan dioptimalkan oleh Perl. Oleh karena itu, pencarian akan dipaksa untuk memeriksa array asosiatif setiap kali pernyataan dieksekusi. Akibatnya, metode kedua tidak efisien dan harus digunakan hanya untuk demonstrasi bagaimana tabel simbol diterapkan secara internal. Contoh lain dalam pernyataan ini kamran husain menyebabkan variabel, subrutin, dan file handle yang diberi nama melalui simbol kamran untuk juga diatasi melalui simbol husain. Artinya, semua entri simbol dalam tabel simbol saat ini dengan kunci kamran sekarang akan berisi referensi pada simbol yang dialamatkan oleh kunci husain. Untuk mencegah penugasan global seperti itu, Anda dapat menggunakan referensi eksplisit. Misalnya, pernyataan berikut ini akan membiarkan Anda menangani isi husain melalui variabel kamran. Kamran husain Namun, susunan seperti kamran dan husain tidak akan sama. Hanya apa rujukan yang ditentukan secara eksplisit akan diubah. Untuk meringkas, ketika Anda menetapkan satu typeglob ke yang lain, Anda memengaruhi semua entri dalam tabel simbol terlepas dari jenis variabel yang sedang dirujuk. Bila Anda menetapkan referensi dari satu jenis variabel ke variabel lainnya, Anda hanya memengaruhi satu entri di tabel simbol. File modul Perl memiliki format berikut: package ModuleName. Masukkan kode modul 1 Nama filenya harus disebut ModuleName. pm. Nama modul harus diakhiri dengan string. pm oleh konvensi. Pernyataan paket adalah baris pertama dari file. Baris terakhir dari file harus berisi baris dengan 1 pernyataan. Ini berlaku mengembalikan nilai sebenarnya pada program aplikasi dengan menggunakan modul. Tidak menggunakan pernyataan 1 tidak akan membiarkan modul dimuat dengan benar. Pernyataan paket memberitahu penerjemah Perl untuk memulai dengan domain namespace baru. Pada dasarnya, semua variabel Anda dalam skrip Perl termasuk paket yang disebut main. Setiap variabel dalam paket utama dapat disebut sebagai variabel utama. Heres sintaks untuk referensi seperti: packageNamevariableName Kutipan tunggal () identik dengan operator double colon (::). Saya membahas lebih banyak penggunaan :: operator di bab berikutnya. Untuk saat ini, Anda harus ingat bahwa dua pernyataan berikut ini setara: packageNamevariableName packageName :: variableName Sintaks double-colon dianggap standar di dunia Perl. Oleh karena itu, untuk melestarikan keterbacaan, saya menggunakan sintaks double-colon di bagian lain buku ini kecuali jika benar-benar diperlukan untuk membuat pengecualian untuk membuktikan suatu hal. Penggunaan default dari nama variabel yang menjadi defers ke paket saat ini aktif pada saat kompilasi. Jadi, jika Anda berada di dalam paket Finance. pm dan tentukan variabel pv. Variabelnya sebenarnya sama dengan Finance :: pv. Menggunakan Modul Perl: gunakan vs require Anda menyertakan modul Perl di program Anda dengan menggunakan use atau require statement. Heres cara untuk menggunakan salah satu dari pernyataan ini: menggunakan ModuleName memerlukan ModuleName Perhatikan bahwa ekstensi. pm tidak digunakan dalam kode yang ditunjukkan di atas. Perhatikan juga bahwa tidak ada pernyataan yang memungkinkan sebuah file dimasukkan lebih dari satu kali dalam sebuah program. Nilai yang dikembalikan dari true (1) sebagai pernyataan terakhir diharuskan membiarkan Perl mengetahui bahwa dibutuhkan d atau menggunakan modul d yang dimuat dengan benar dan membiarkan penafsir Perl mengabaikan isi ulang apapun. Secara umum, lebih baik menggunakan pernyataan Modul penggunaan daripada yang memerlukan pernyataan Modul dalam program Perl agar tetap kompatibel dengan Perl versi di masa depan. Untuk modul, Anda mungkin ingin mempertimbangkan untuk terus menggunakan pernyataan yang dibutuhkan. Heres mengapa: Pernyataan penggunaan melakukan sedikit lebih banyak pekerjaan daripada pernyataan yang mengharuskannya mengubah ruang kelas modul yang menyertakan modul lain. Anda ingin update tambahan namespace ini dilakukan dalam sebuah program. Namun, saat menulis kode untuk modul, Anda mungkin tidak ingin ruang nama diubah kecuali jika diperlukan secara eksplisit. Dalam acara ini, Anda akan menggunakan pernyataan require. Pernyataan memerlukan mencakup nama path lengkap dari sebuah file dalam array Inc sehingga fungsi dan variabel dalam file modul berada di lokasi yang diketahui selama waktu eksekusi. Oleh karena itu, fungsi yang diimpor dari modul diimpor melalui referensi modul eksplisit saat runtime dengan pernyataan require. Pernyataan penggunaan melakukan hal yang sama seperti pernyataan yang memerlukan karena ia memperbarui array Inc dengan nama lengkap modul yang dimuat. Kode untuk fungsi penggunaan juga berjalan selangkah lebih jauh dan memanggil fungsi impor dalam modul yang sedang digunakan untuk memuat secara eksplisit daftar fungsi yang diekspor pada waktu kompilasi, sehingga menghemat waktu yang dibutuhkan untuk resolusi eksplisit dari nama fungsi selama eksekusi. Pada dasarnya, pernyataan penggunaan setara dengan persyaratan ModuleName import ModuleName daftar fungsi yang diimpor Penggunaan pernyataan penggunaan tidak mengubah namespace program Anda karena nama fungsi yang diimpor dimasukkan ke dalam tabel simbol. Pernyataan yang mengharuskan tidak mengubah namespace program Anda. Oleh karena itu, pernyataan berikut menggunakan ModuleName () setara dengan pernyataan ini: memerlukan Fungsi ModuleName yang diimpor dari modul melalui panggilan ke fungsi yang disebut impor. Anda dapat menulis fungsi impor Anda sendiri dalam modul, atau Anda dapat menggunakan modul Eksportir dan menggunakan fungsi impornya. Dalam hampir semua kasus, Anda akan menggunakan modul Eksportir untuk memberikan fungsi impor alih-alih menemukan kembali kemudi. (Jika Anda memutuskan untuk tidak menggunakan modul Eksportir, Anda harus menulis fungsi impor Anda sendiri di setiap modul yang Anda tulis. Yang jauh lebih mudah untuk hanya menggunakan modul Eksportir dan membiarkan Perl melakukan pekerjaan untuk Anda. Modul Contoh Letter. pm Cara terbaik untuk menggambarkan semantik bagaimana modul digunakan di Perl adalah menulis modul sederhana dan menunjukkan bagaimana cara menggunakannya. Mari ambil contoh hiu pinjaman lokal, Rudious Maximus, yang hanya bosan mengetikkan kuotasi yang sama dengan surat pembayaran. Menjadi penggemar berat komputer dan Perl, Rudious mengambil pendekatan pemrogram yang malas dan menulis sebuah modul Perl untuk membantunya menghasilkan memo dan suratnya. Sekarang, alih-alih mengetik di dalam field dalam file template memo, yang harus dia lakukan hanyalah mengetikkan beberapa baris untuk menghasilkan catatannya yang bagus dan mengancam. Listing 4.1 menunjukkan kepada Anda apa yang harus diketiknya. Listing 4.1. Menggunakan modul Letter. 1 usrbinperl - w 2 3 Uncomment garis di bawah ini untuk menyertakan perintah dir in Inc. 4 push (Inc, pwd) 5 6 gunakan Letter 7 8 Letter :: To (quotMr Gambling Manquot, quotThe money for Lucky Dog, Race 2quot) 9 Letter :: ClaimMoneyNice () 10 Letter :: ThankDem () 11 Letter :: Finish () Penggunaan Letter statement hadir untuk memaksa penerjemah Perl memasukkan kode modul dalam program aplikasi. Modul harus ditempatkan di direktori usrlibperl5, atau Anda dapat menempatkannya di direktori manapun yang tercantum dalam array Inc. The Inc array adalah daftar direktori yang akan dicari juru bahasa Perl saat mencoba memuat kode untuk modul yang diberi nama. Baris komentar (nomor 4) menunjukkan bagaimana menambahkan direktori kerja saat ini untuk menyertakan jalurnya. Empat baris berikutnya dalam file tersebut menghasilkan materi pokok untuk surat tersebut. Heres output dari menggunakan modul Letter: To: Mr. Gambling Man Fm: Rudolf Maximus, Loan Shark Dt: Wed Feb 7 10:35:51 CST 1996 Re: Uang untuk Anjing Beruntung, Ras 2 Telah sampai pada perhatian saya Bahwa akun Anda sudah lewat. Anda akan membayar kami segera Atau apakah Anda ingin saya datang ovah Terima kasih atas dukungan Anda File modul Letter ditunjukkan pada Listing 4.2. Nama paket dinyatakan di baris pertama. Karena fungsi modul ini akan diekspor, saya menggunakan modul Exporter. Oleh karena itu, pernyataan menggunakan Eksportir diwajibkan untuk mewarisi fungsionalitas dari modul Eksportir. Langkah lain yang diperlukan adalah meletakkan kata yang diekspor dalam array ISA untuk memungkinkan pencarian Exported. pm. Array ISA adalah array khusus dalam setiap paket. Setiap item dalam daftar array mana lagi untuk mencari metode jika tidak dapat ditemukan dalam paket saat ini. Urutan paket yang tercantum dalam array ISA adalah urutan di mana Perl mencari simbol yang belum terselesaikan. Kelas yang terdaftar dalam array ISA disebut sebagai kelas dasar kelas tertentu. Perl akan menyimpan metode yang hilang yang ditemukan di kelas dasar untuk referensi di masa mendatang. Memodifikasi array ISA akan menyiram cache dan menyebabkan Perl untuk mencari semua metode lagi. Mari sekarang lihat kode untuk Letter. pm di Listing 4.2. Listing 4.2. Modul Letter. pm. 1 paket Surat 2 3 memerlukan Eksportir 4 ISA (Eksportir) 5 6 head1 NAMA 7 8 Letter - Modul contoh untuk menghasilkan kop surat untuk Anda 9 10 head1 SYNOPSIS 11 12 gunakan Letter 13 14 Letter :: Date () 15 Letter :: To (name , Perusahaan, alamat) 16 17 Kemudian salah satu dari berikut ini: 18 Letter :: ClaimMoneyNice () 19 Letter :: ClaimMoney () 20 Letter :: ThreatBreakLeg () 21 22 Letter :: ThankDem () 23 Letter :: Selesai () 24 25 head1 URAIAN 26 27 Modul ini memberikan contoh singkat untuk menghasilkan sebuah surat untuk seekor hiu pinjaman ramah lingkungan 28 yang ramah. Kode dimulai setelah pernyataan quotcutquot. 31 potong 32 33 EKSPOR qw (Date, 34 To, 35 ClaimMoney, 36 ClaimMoneyNice, 37 ThankDem, 38 Finish) 39 40 41 Cetak todays date 42 43 sub Letter :: Tanggal 44 tanggal tanggal 45 print quotn Today is datequot 46 47 48 sub Surat :: Kepada 49 orang lokal (nama) shift 50 orang lokal (subjek) shift 51 print quotn Kepada: namequot 52 print quotn Fm: Rudious Maximus, Sharkquot Pinjaman 53 print quotn Dt: quot, date 54 print quotn Re: subjectquot 55 print quotnnquot 56 Print quotnnquot 57 58 sub Letter :: ClaimMoney () 59 print quotn Anda berutang uang kepada saya. Minta aksimu bersama-sama mengumpulkan kuota cetak Apakah Anda ingin saya mengirim Bruno untuk mengutip 61 kutipan cetak untuk mengumpulkannya. Atau Anda akan membayar upquot 62 63 64 sub Letter :: ClaimMoneyNice () 65 print quotn Terlintas perhatian saya bahwa akun Anda adalah kutipan cetak melalui kutipan. quot 67 print quotn Anda akan segera membayarnya. quot 68 Print quotn atau apakah Anda ingin saya datang ovahquot 69 70 71 sub Letter :: ThreatBreakLeg () 72 print quotn rupanya huruf seperti ini tidak membantu kuota cetak Saya harus memberi contoh tentang Anda mencetak 74 kutipan cetak n Sampai jumpa di rumah sakit , Palquot 75 76 77 sub Letter :: ThankDem () 78 print quotnn Terima kasih atas dukungannya 79 80 81 sub huruf :: Selesai () 82 printf quotnnnn Sincerelyquot 83 printf quotn Rudious n quot 84 85 86 1 Baris yang berisi tanda sama dengan yang digunakan Untuk dokumentasi Anda harus mendokumentasikan setiap modul untuk modul Perl referensi Anda sendiri tidak perlu didokumentasikan, namun ada baiknya menulis beberapa baris tentang kode Anda. Beberapa tahun dari sekarang, Anda mungkin lupa seperti apa modul itu. Dokumentasi yang baik selalu merupakan suatu keharusan jika Anda ingin mengingat apa yang Anda lakukan di masa lalu. Saya membahas gaya dokumentasi yang digunakan untuk Perl di Bab 8. quotDocumenting Perl Scripts. quot Untuk modul contoh ini, pernyataan head1 memulai dokumentasi. Semuanya sampai dengan pernyataan yang dipotong diabaikan oleh penerjemah Perl. Selanjutnya, modul daftar semua fungsi yang diekspor oleh modul ini dalam array EKSPOR. Array EXPORT mendefinisikan semua nama fungsi yang dapat dipanggil dengan kode dari luar. Jika Anda tidak mencantumkan fungsi dalam array EKSPOR ini, tidak akan terlihat oleh modul kode eksternal. Setelah array EXPORT adalah body dari kode, satu subrutin pada satu waktu. Setelah semua subrutin didefinisikan, pernyataan akhir 1 mengakhiri file modul. 1 harus menjadi baris eksekusi terakhir dalam file. Mari kita lihat beberapa fungsi yang didefinisikan dalam modul ini. Fungsi pertama yang harus dilihat adalah fungsi Tanggal sederhana, baris 43 sampai 46, yang mencetak tanggal dan waktu UNIX saat ini. Tidak ada parameter untuk fungsi ini, dan tidak mengembalikan sesuatu yang berarti kembali ke pemanggil. Perhatikan penggunaan variabel sebelum variabel tanggal 44. Kata kunci saya digunakan untuk membatasi lingkup variabel ke dalam kurung kurir fungsi Tanggal. Kode antara kurung kurawal disebut sebagai blok. Variabel yang dideklarasikan dalam satu blok dibatasi dalam lingkup kurung kurawal. Pada 49 dan 50, nama dan subjek variabel lokal dapat dilihat oleh semua fungsi. Anda juga bisa mendeklarasikan variabel dengan kualifikasi lokal. Penggunaan lokal memungkinkan sebuah variabel berada dalam lingkup blok saat ini dan juga blok kode lain yang dipanggil dari dalam blok ini. Dengan demikian, x lokal yang dinyatakan dalam satu blok dapat dilihat oleh semua blok berikutnya yang dipanggil dari dalam blok ini dan dapat dirujuk. Dalam contoh kode berikut, variabel nama fungsi ToTitled dapat diakses namun bukan data di iphone. 1 sub huruf :: ToTitled 2 nama lokal (nama) shift 3 shift telepon saya Contoh kode untuk Letter. pm menunjukkan cara mengekstrak satu parameter sekaligus. Subroutine To () membutuhkan dua parameter untuk menyiapkan header untuk memo tersebut. Menggunakan fungsi dalam modul tidak berbeda dengan menggunakan dan mendefinisikan modul Perl dalam file kode yang sama. Parameter dilewatkan dengan referensi kecuali ditentukan lain. Beberapa array dilewatkan ke subrutin, jika tidak secara eksplisit dereferenced menggunakan garis miring terbalik, digabungkan. Array masukan dalam suatu fungsi selalu berupa array nilai skalar. Melewati nilai dengan referensi adalah cara yang lebih disukai di Perl untuk mengeluarkan sejumlah besar data ke dalam subrutin. (Lihat Bab 3. quotReferences. quot) Modul Contoh Lain: Keuangan Modul Keuangan, yang ditunjukkan pada Listing 4.3, digunakan untuk memberikan perhitungan sederhana untuk nilai pinjaman. Menggunakan modul Keuangan sangat mudah. Semua fungsi ditulis dengan parameter yang sama, seperti yang ditunjukkan pada rumus untuk fungsi. Mari kita lihat bagaimana nilai masa depan suatu investasi dapat dihitung. Misalnya, jika Anda menginvestasikan beberapa dolar, pv. Dalam obligasi yang menawarkan tingkat bunga tetap, r. Diaplikasikan pada interval yang diketahui untuk periode waktu n, berapakah nilai ikatan pada saat kadaluwarsanya. Dalam kasus ini, Anda akan menggunakan rumus berikut: fv pv (1r) n Fungsi untuk mendapatkan nilai masa depan dinyatakan sebagai FutureValue . Lihat Listing 4.3 untuk melihat bagaimana menggunakannya. Listing 4.3. Menggunakan modul Keuangan. 1 usrbinperl - w 2 3 push (Inc, pwd) 4 menggunakan Keuangan 5 6 pinjaman 5000,00 7 apr 3,5 APR 8 tahun 10 tahun. 9 10 ------------------------------------------------ ---------------- 11 Hitung nilai pada akhir pinjaman jika bunga 12 diterapkan setiap tahun. 13 ------------------------------------------------- --------------- 14 tahun waktu 15 fv1 Keuangan :: FutureValue (pinjaman, apr, time) 16 print quotn Jika bunga diterapkan pada akhir tahunquot 17 print quotn Nilai masa depan untuk Pinjaman dari quot. pinjaman. Quotnquot 18 print quot di APR of quot, apr. Quot untuk quot, waktu, quot tahunquot 19 printf quot adalah 8.2f nquot. Fv1 20 21 ----------------------------------------------- ----------------- 22 Hitung nilai pada akhir pinjaman jika bunga 23 diterapkan setiap bulan. 24 ------------------------------------------------- --------------- 25 tingkat apr 12 APR 26 tahun ke-12 dalam bulan 27 fv2 Keuangan :: FutureValue (pinjaman, tarif, waktu) 28 29 print quotn Jika bunga diterapkan pada akhir Setiap bulannya 30 print quotn Nilai masa depan untuk pinjaman quot. pinjaman. Quotnquot 31 mencetak quot di kuota kuota, apr. Quot untuk quot, waktu, quot bulanquot 32 printf quot adalah 8.2f nquot. Fv2 33 34 printf quotn Perbedaan nilainya adalah 8.2fquot, fv2 - fv1 35 printf quotn Oleh karena itu dengan menerapkan bunga pada periode waktu yang lebih singkat, maka kita memperoleh lebih banyak uang dengan bunga. Berikut adalah contoh input dan output dari Listing 4.3. Testme Jika bunga diterapkan pada akhir tahun Nilai masa depan untuk pinjaman sebesar 5000 pada APR 3,5 selama 10 tahun adalah 7052,99 Jika bunga diterapkan pada akhir bulan berikutnya Nilai masa depan untuk pinjaman sebesar 5000 pada APR 3,5 untuk 120 bulan adalah 7091,72 Perbedaan nilai adalah 38,73 Oleh karena itu dengan menerapkan bunga pada periode waktu yang lebih singkat kita benar-benar mendapatkan lebih banyak uang yang diminati. Wahyu dalam output adalah hasil perbandingan nilai antara fv1 dan fv2. Nilai fv1 dihitung dengan aplikasi bunga setiap tahun selama masa pakai obligasi. Fv2 adalah nilai jika bunga diaplikasikan setiap bulan pada tingkat bunga bulanan yang setara. Paket Finance. pm ditunjukkan pada Listing 4.4 pada tahap pengembangan awal. Listing 4.4. Paket Finance. pm. 1 paket Keuangan 2 3 memerlukan Eksportir 4 ISA (Eksportir) 5 6 head1 Keuangan. pm 7 8 Kalkulator Keuangan - Perhitungan keuangan menjadi mudah dengan Perl 9 10 head 2 11 menggunakan Keuangan 12 13 pv 10000.0 14 15 tingkat 12,5 12 APR per bulan. 16 17 kali 360 bulan untuk pinjaman hingga jatuh tempo 18 19 fv FutureValue () 20 21 cetak 23 22 dipotong 24 25 EKSPOR qw (Nilai Lebih Jauh, 26 Nilai Sekarang, 27 FVofAnnuity, 28 AnnuityOfFV, 29 getLastAverage, 30 getMovingAverage, 31 SetInterest) 32 33 34 Globals, jika ada 35 36 37 default lokalInterest 5.0 38 39 sub Finance :: SetInterest () 40 shift rate saya () 41 defaultInterest rate 42 printf quotn defaultInterest ratequot 43 44 45 -------------- -------------------------------------------------- ---- 46 Catatan: 47 1. Tingkat suku bunga r diberikan dalam nilai 0-100. 2. Ketentuan yang diberikan adalah tingkat bunga yang diterapkan. 50 51 ------------------------------------------------ -------------------- 52 53 ---------------------------- ---------------------------------------- 54 Nilai sekarang dari investasi yang diberikan 55 fv - Nilai masa depan 56 r - rate per periode 57 n - jumlah periode 58 ---------------------------------- ---------------------------------- 59 sub Keuangan :: FutureValue () 60 saya (pv, r, n ) 61 fv pv saya ((1 (r100)) n) 62 kembali fv 63 64 65 ------------------------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Nilai 68 r - rate per periode 69 n - jumlah periode 70 ------------------------------------ -------------------------------- 71 sub Keuangan :: PresentValue () 72 my pv 73 my (fv, r, N) 74 pv fv ((1 (r100)) n) 75 kembali pv 76 77 78 79 ----------------------------- --------------------------------------- 80 Dapatkan nilai masa depan anuitas yang diberikan 81 mp - Pembayaran Tahunan Annuity 82 r - rate per periode 83 n - number o F periode 84 ----------------------------------------------- --------------------- 85 86 sub FVofAnnuity () 87 my fv 88 my oneR 89 my (mp, r, n) 90 91 oneR (1 r) n 92 fv mp ((satuR - 1) r) 93 kembali fv 94 95 96 --------------------------------- ----------------------------------- 97 Dapatkan anuitas dari bit informasi berikut 98 r - rate per Periode 99 n - jumlah periode 100 fv - Nilai Masa Depan 101 ------------------------------------- ------------------------------- 102 103 sub AnnuityOfFV () 104 mp mp saya - Pembayaran Anuitas Bulanan 105 my oneR 106 Saya (fv, r, n) 107 108 satuR (1 r) n 109 mp fv (r (satuR - 1)) 110 kembali mp 111 112 113 ----------------- -------------------------------------------------- - 114 Dapatkan rata-rata nilai quotnquot terakhir dalam sebuah array. 115 ------------------------------------------------- ------------------- 116 Jumlah penghitungan terakhir elemen dari array dalam nilai 117 Jumlah elemen dalam nilai ada dalam angka 118 119 sub getLastAverage () 120 saya (Hitungan, angka, nilai) 121 saya saya 123 123 a a 0 124 return 0 if (count 0) 125 for (i 0 ilt count i) 126 nilai-nilaiNumber - i-1 127 128 mengembalikan hitungan 129 130 131 --- -------------------------------------------------- --------------- 132 Dapatkan nilai rata-rata bergerak. 133 ------------------------------------------------- ------------------- 134 Ukuran jendela adalah parameter pertama, jumlah item pada 135 array yang dilewati selanjutnya. (Ini dapat dengan mudah dihitung dalam fungsi 136 dengan menggunakan fungsi skalar (), namun subrutin yang ditunjukkan di sini 137 juga digunakan untuk menggambarkan bagaimana cara melewatkan petunjuk.) Rujukan ke 138 nilai dilewati berikutnya, diikuti oleh Mengacu pada tempat itu, nilai pengembaliannya harus disimpan. 140 141 sub getMovingAve () 142 saya (menghitung, jumlah, nilai, pindah) saya saya 0 0 0 0 0 0 0 0 147 147 kembali 0 jika (hitung 0) 148 kembali -1 jika (hitung nomor gt) 149 return - 2 jika (hitung lt 2) 150 151 movingAve0 0 152 movingAvenumber - 1 0 153 for (i0 iltcounti) 154 v valuesi 155 av count 156 movingAvei 0 157 158 for (icount iltnumberi) 159 v valuesi 160 av count 161 v valuesi - count - 1 162 a - v count 163 moveAvei a 164 165 return 0 166 167 168 1 Lihatlah deklarasi fungsi FutureValue dengan (). Tiga tanda dolar bersama-sama menandakan tiga nomor skalar yang masuk ke fungsi tersebut. Pelingkupan tambahan ini hadir untuk memvalidasi jenis parameter yang dilewatkan ke fungsi. Jika Anda melewati sebuah string dan bukan angka ke dalam fungsi, Anda akan mendapatkan pesan yang sangat mirip dengan yang satu ini: Terlalu banyak argumen untuk Keuangan :: FutureValue di. f4.pl line 15, near quottime) quot Pelaksanaan. f4.pl dibatalkan karena kesalahan kompilasi. Penggunaan prototipe saat menentukan fungsi mencegah Anda mengirimkan nilai selain dari apa yang diharapkan oleh fungsi. Gunakan atau untuk lulus dalam berbagai nilai. Jika Anda melewati referensi, gunakan atau untuk menunjukkan referensi skalar ke array atau hash. Jika Anda tidak menggunakan garis miring terbalik, semua tipe lain dalam daftar argumen prototipe diabaikan. Jenis diskualifikasi lainnya termasuk ampersand untuk referensi ke fungsi, tanda bintang untuk jenis apa pun, dan titik koma untuk menunjukkan bahwa semua parameter lainnya bersifat opsional. Now, lets look at the lastMovingAverage function declaration, which specifies two integers in the front followed by an array. The way the arguments are used in the function is to assign a value to each of the two scalars, count and number . whereas everything else is sent to the array. Look at the function getMovingAverage() to see how two arrays are passed in order to get the moving average on a list of values. The way to call the getMovingAverage function is shown in Listing 4.5. Listing 4.5. Using the moving average function. 1 usrbinperl - w 2 3 push(Inc, pwd) 4 use Finance 5 6 values ( 12,22,23,24,21,23,24,23,23,21,29,27,26,28 ) 7 mv (0) 8 size scalar(values) 9 print quotn Values to work with nquot 10 print quot Number of values size nquot 11 12 ---------------------------------------------------------------- 13 Calculate the average of the above function 14 ---------------------------------------------------------------- 15 ave Finance::getLastAverage(5,size, values) 16 print quotn Average of last 5 days ave nquot 17 18 Finance::getMovingAve(5,size, values, mv) 19 print quotn Moving Average with 5 days window n nquot Heres the output from Listing 4.5: Values to work with Number of values 14 Average of last 5 days 26.2 The getMovingAverage() function takes two scalars and then two references to arrays as scalars. Within the function, the two scalars to the arrays are dereferenced for use as numeric arrays. The returned set of values is inserted in the area passed in as the second reference. Had the input parameters not been specified with for each referenced array, the movingAve array reference would have been empty and would have caused errors at runtime. In other words, the following declaration is not correct: sub getMovingAve() The resulting spew of error messages from a bad function prototype is as follows: Use of uninitialized value at Finance. pm line 128. Use of uninitialized value at Finance. pm line 128. Use of uninitialized value at Finance. pm line 128. Use of uninitialized value at Finance. pm line 128. Use of uninitialized value at Finance. pm line 128. Use of uninitialized value at Finance. pm line 133. Use of uninitialized value at Finance. pm line 135. Use of uninitialized value at Finance. pm line 133. Use of uninitialized value at Finance. pm line 135. Use of uninitialized value at Finance. pm line 133. Use of uninitialized value at Finance. pm line 135. Use of uninitialized value at Finance. pm line 133. Use of uninitialized value at Finance. pm line 135. Use of uninitialized value at Finance. pm line 133. Use of uninitialized value at Finance. pm line 135. Use of uninitialized value at Finance. pm line 133. Use of uninitialized valu e at Finance. pm line 135. Use of uninitialized value at Finance. pm line 133. Use of uninitialized value at Finance. pm line 135. Use of uninitialized value at Finance. pm line 133. Use of uninitialized value at Finance. pm line 135. Use of uninitialized value at Finance. pm line 133. Use of uninitialized value at Finance. pm line 135. Average of last 5 days 26.2 Moving Average with 5 days window This is obviously not the correct output. Therefore, its critical that you pass by reference when sending more than one array. Global variables for use within the package can also be declared. Look at the following segment of code from the Finance. pm module to see what the default value of the Interest variable would be if nothing was specified in the input. (The current module requires the interest to be passed in, but you can change this.) Heres a little snippet of code that can be added to the end of the program shown in Listing 4.5 to add the ability to set interest rates. 20 local defaultInterest 5.0 21 sub Finance::SetInterest() 22 my rate shift() 23 rate -1 if (rate lt 0) 24 defaultInterest rate 25 printf quotn defaultInterest ratequot 26 The local variable defaultInterest is declared in line 20. The subroutine SetInterest to modify the rate is declared in lines 21 through 26. The rate variable uses the values passed into the subroutine and simply assigns a positive value for it. You can always add more error checking if necessary. To access the defaultInterest variables value, you could define either a subroutine that returns the value or refer to the value directly with a call to the following in your application program: Finance::defaultInterest The variable holding the return value from the module function is declared as my variable . The scope of this variable is within the curly braces of the function only. When the called subroutine returns, the reference to my variable is returned. If the calling program uses this returned reference somewhere, the link counter on the variable is not zero therefore, the storage area containing the returned values is not freed to the memory pool. Thus, the function that declares my pv and then later returns the value of pv returns a reference to the value stored at that location. If the calling routine performs a call like this one: Finance::FVofAnnuity(monthly, rate, time) there is no variable specified here into which Perl stores the returned reference therefore, any returned value (or a list of values) is destroyed. Instead, the call with the returned value assigned to a local variable, such as this one: fv Finance::FVofAnnuity(monthly, rate, time) maintains the variable with the value. Consider the example shown in Listing 4.6, which manipulates values returned by functions. Listing 4.6. Sample usage of the my function. 1 usrbinperl - w 2 3 push(Inc, pwd) 4 use Finance 5 6 monthly 400 7 rate 0.2 i. e. 6 APR 8 time 36 in months 9 10 print quotn ------------------------------------------------quot 11 fv Finance::FVofAnnuity(monthly, rate, time) 12 printf quotn For a monthly 8.2f at a rate of 6.2f for d periodsquot, 13 monthly, rate, time 14 printf quotn you get a future value of 8.2f quot, fv 15 16 fv 1.1 allow 10 gain in the house value. 17 18 mo Finance::AnnuityOfFV(fv, rate, time) 19 20 printf quotn To get 10 percent more at the end, i. e. 8.2fquot, fv 21 printf quotn you need a monthly payment value of 8.2fquot, mo, fv 22 23 print quotn ------------------------------------------------ nquot Here is sample input and output for this function: testme ------------------------------------------------ For a monthly 400.00 at a rate of 0.20 for 36 periods you get a future value of 1415603.75 To get 10 percent more at the end, i. e. 1557164.12 you need a monthly payment value of 440.00 ------------------------------------------------ Modules implement classes in a Perl program that uses the object-oriented features of Perl. Included in object-oriented features is the concept of inheritance . (Youll learn more on the object-oriented features of Perl in Chapter 5. quotObject-Oriented Programming in Perl. quot) Inheritance means the process with which a module inherits the functions from its base classes. A module that is nested within another module inherits its parent modules functions. So inheritance in Perl is accomplished with the :: construct. Heres the basic syntax: SuperClass::NextSubClass. ThisClass. The file for these is stored in. SuperClassNextSubClass133 . Each double colon indicates a lower-level directory in which to look for the module. Each module, in turn, declares itself as a package with statements like the following: package SuperClass::NextSubClass package SuperClass::NextSubClass::EvenLower For example, say that you really want to create a Money class with two subclasses, Stocks and Finance . Heres how to structure the hierarchy, assuming you are in the usrlibperl5 directory: Create a Money directory under the usrlibperl5 directory. Copy the existing Finance. pm file into the Money subdirectory. Create the new Stocks. pm file in the Money subdirectory. Edit the Finance. pm file to use the line package Money::Finance instead of package Finance . Edit scripts to use Money::Finance as the subroutine prefix instead of Finance:: . Create a Money. pm file in the usrlibperl5 directory. The Perl script that gets the moving average for a series of numbers is presented in Listing 4.7. Listing 4.7. Using inheriting modules. 1 usrbinperl - w 2 aa pwd 3 aa . quotMoneyquot 4 push(Inc, aa) 5 use Money::Finance 6 values ( 12,22,23,24,21,23,24,23,23,21,29,27,26,28 ) 7 mv (0) 8 size scalar(values) 9 print quotn Values to work with nquot 10 print quot Number of values size nquot 11 ---------------------------------------------------------------- 12 Calculate the average of the above function 13 ---------------------------------------------------------------- 14 ave Money::Finance::getLastAverage(5,size, values) 15 print quotn Average of last 5 days ave nquot 16 Money::Finance::getMovingAve(5,size, values, mv) 17 foreach i (values) 18 print quotn Moving with 5 days window mvi nquot 19 20 print quotn Moving Average with 5 days window n nquot Lines 2 through 4 add the path to the Money subdirectory. The use statement in line 5 now addresses the Finance. pm file in the. Money subdirectory. The calls to the functions within Finance. pm are now called with the prefix Money::Finance:: instead of Finance:: . Therefore, a new subdirectory is shown via the :: symbol when Perl is searching for modules to load. The Money. pm file is not required. Even so, you should create a template for future use. Actually, the file would be required to put any special requirements for initialization that the entire hierarchy of modules uses. The code for initialization is placed in the BEGIN() function. The sample Money. pm file is shown in Listing 4.8. Listing 4.8. The superclass module for Finance. pm . 1 package Money 2 require Exporter 3 4 BEGIN 5 printf quotn Hello Zipping into existence for younquot 6 7 1 To see the line of output from the printf statement in line 5, you have to insert the following commands at the beginning of your Perl script: use Money use Money::Finance To use the functions in the Stocks. pm module, you use this line: use Money::Stocks The Stocks. pm file appears in the Money subdirectory and is defined in the same format as the Finance. pm file, with the exceptions that use Stocks is used instead of use Finance and the set of functions to export is different. A number of modules are included in the Perl distribution. Check the usrlibperl5lib directory for a complete listing after you install Perl. There are two kinds of modules you should know about and look for in your Perl 5 release, Pragmatic and Standard modules. Pragmatic modules, which are also like pragmas in C compiler directives, tend to affect the compilation of your program. They are similar in operation to the preprocessor elements of a C program. Pragmas are locally scoped so that they can be turned off with the no command. Thus, the command no POSIX turns off the POSIX features in the script. These features can be turned back on with the use statement. Standard modules bundled with the Perl package include several functioning packages of code for you to use. Refer to appendix B, quotPerl Module Archives, quot for a complete list of these standard modules. To find out all the. pm modules installed on your system, issue the following command. (If you get an error, add the usrlibperl5 directory to your path.) find usrlibperl5 - name perl quot. pmquot - print Extension modules are written in C (or a mixture of Perl and C) and are dynamically loaded into Perl if and when you need them. These types of modules for dynamic loading require support in the kernel. Solaris lets you use these modules. For a Linux machine, check the installation pages on how to upgrade to the ELF format binaries for your Linux kernel. The term CPAN (Comprehensive Perl Archive Network) refers to all the hosts containing copies of sets of data, documents, and Perl modules on the Net. To find out about the CPAN site nearest you, search on the keyword CPAN in search engines such as Yahoo. AltaVista, or Magellan. A good place to start is the metronet site . This chapter introduced you to Perl 5 modules and described what they have to offer. A more comprehensive list is found on the Internet via the addresses shown in the Web sites metronet and perl . A Perl package is a set of Perl code that looks like a library file. A Perl module is a package that is defined in a library file of the same name. A module is designed to be reusable. You can do some type checking with Perl function prototypes to see whether parameters are being passed correctly. A module has to export its functions with the EXPORT array and therefore requires the Exporter module. Modules are searched for in the directories listed in the Inc array. Obviously, there is a lot more to writing modules for Perl than what is shown in this chapter. The simple examples in this chapter show you how to get started with Perl modules. In the rest of the book I cover the modules and their features, so hang in there. I cover Perl objects, classes, and related concepts in Chapter 5.This is an Evergreen Joe Celko question. Saya mengabaikan platform DBMS yang digunakan. Tapi bagaimanapun Joe bisa menjawab lebih dari 10 tahun yang lalu dengan SQL standar. Joe Celko SQL Puzzles and Answer citation: Upaya pembaruan terakhir menunjukkan bahwa kita dapat menggunakan predikat untuk membuat kueri yang akan memberi kita rata-rata bergerak: Apakah kolom tambahan atau pendekatan kueri lebih baik Permintaan secara teknis lebih baik karena pendekatan UPDATE akan Denormalize database Namun, jika data historis yang tercatat tidak akan berubah dan menghitung rata-rata bergerak mahal, Anda mungkin mempertimbangkan untuk menggunakan pendekatan kolom. Query SQL Puzzle: dengan segala cara seragam Anda hanya membuang ember yang sesuai tergantung jarak dari titik waktu saat ini. Misalnya quottake weight1 untuk datapoints dalam waktu 24 jam dari level datapoint saat ini0,5 untuk datapoints dalam 48hrsquot. Kasus itu penting berapa banyak datapoint berurutan (seperti 6:12 dan 11:48) jauh dari satu sama lain Kasus penggunaan yang dapat saya pikirkan akan menjadi upaya untuk memperlancar histogram dimanapun datapoint tidak cukup padat ndash msciwoj 27 Mei di 22:22 Saya tidak yakin hasil yang diharapkan (output) Anda menunjukkan rata-rata bergerak sederhana (bergulir) rata-rata selama 3 hari. Sebab, misalnya, tiga angka pertama menurut definisi memberi: tapi Anda memperkirakan 4.360 dan membingungkannya. Meski begitu, saya menyarankan solusi berikut, yang menggunakan fungsi jendela AVG. Pendekatan ini jauh lebih efisien (jelas dan kurang intensif sumber daya) daripada DIRI-JOIN yang diperkenalkan pada jawaban lain (dan saya terkejut bahwa tidak ada yang memberikan solusi yang lebih baik). Anda melihat bahwa AVG dibungkus dengan kasus ketika rownum gt p. days kemudian memaksa NULL s pada baris pertama, di mana 3 hari Moving Average tidak ada artinya. Jawab 23 Feb 16 at 13:12 Kita bisa menerapkan metode join kiri kiri Joe Celkos (seperti yang dikutip oleh Diego Scaravaggi) untuk menjawab pertanyaan seperti yang ditanyakan. Menghasilkan output yang diminta: dijawab 9 Jan 16 at 0:33 Jawaban Anda 2017 Stack Exchange, Inc

No comments:

Post a Comment