Moving Genomsnittet Perl
Med viktvektor menar jag vektorn med vikter som du måste multiplicera observationerna i fönstret som glider över dina data med så om du lägger till dessa produkter tillsammans returnerar du EMAs värde på höger sida av fönstret. För en linjär Viktat glidande medelvärdet formel för att hitta viktvektorn är 1 n summa 1 n i R-kod Denna serie längd n lägger till 1 För n 10 blir det 0 01818182 0 03636364 0 09090909 0 10909091 0 12727273 0 10909091 0 12727273 0 14545455 0 16363636 0 18181818.numren 1 till 10 55, med 55 summan av numren 1 till 10. Hur räknar du ut vektorgraden för ett exponentiellt rörligt medelvärde EMA med längd n. if n är längden på fönstret, Då alfa -2 n 1 och i -1 n så EmaWeightVector - alfa 1-alfa 1-i. Detta är korrekt. Även om EMA inte egentligen är begränsad till ett fönster med start och slut, borde inte vikterna lägga till Till 1 precis som med LWMA. Tack Jason, några tips om hur man approximerar EMA-filtret till önskat p recision genom att approximera den med ett tillräckligt långa FIR-filter. Det sålunda perl-skriptet på det skapade bilden av EMA-vektorn, men jag förstår inte om de anger antal vikter till 15 varför finns det 20 röda staplar istället för 15 MisterH Dec 19 12 på 22 40.Detta kapitel introducerar dig till begreppen bakom referenser till Perl-moduler, paket och klasser. Det visar också hur du skapar några provmoduler. Perl-modulen är en uppsättning Perl-kod som fungerar som en bibliotek av funktionssamtal Termen modulen i Perl är synonym med ordpaketet Paket är en funktion av Perl 4, medan moduler förekommer i Perl 5. Du kan behålla all din återanvändbara Perl-kod som är specifik för en uppsättning uppgifter i en Perl-modul därför , all funktionalitet som hör till en typ av uppgift finns i en fil Det är lättare att bygga en applikation på dessa modulära block. Ordmodulen gäller därför lite mer än paketet. Här är snabb introduktion till moduler Vissa ämnen i det här avsnittet kommer att vara cov Läsas i detalj under resten av boken Läs följande avsnitt noggrant för att få en översikt över vad som ligger framåt när du skriver och använder dina egna moduler. Vad är förvirrande är att termoelementet och paketet används utbytbart i all Perl-dokumentation, och Dessa två villkor betyder detsamma. Så när du läser Perl-dokument, tänk bara på paketet när du ser modulen och vice versa. Så vad är förutsättningen för att använda moduler. Tja, moduler finns där för att paketera med sig av ordvariablerna, symbolerna och samtrafik Dataobjekt tillsammans Till exempel är det möjligt att använda globala variabler med mycket vanliga namn som kj eller jag i ett program i allmänhet inte en bra idé. Även en loopdisk borde jag tillåtas arbeta självständigt i två olika delar av koden, deklarerar jag som En global variabel och sedan öka den från en subrutin kommer att skapa omanagliga problem med din applikationskod eftersom subrutinen kan ha blivit kallad från en loop som också använder en variant Ble kallad I Användningen av moduler i Perl tillåter variabler med samma namn som ska skapas på olika, olika platser i samma program. Symbolerna som definieras för dina variabler lagras i en associativ array, kallad symboltabell. Dessa symboltabeller Är unika för ett paket Därför kan variabler med samma namn i två olika paket ha olika värden. Varje modul har sin egen symboltabell för alla symboler som deklareras inom den. Symboltabellen isolerar i synnerhet synonyma namn i en modul från en annan Symbolen Tabellen definierar en namnrymd som är ett utrymme för oberoende variabla namn att existera Således hindrar användningen av moduler, var och en med sin egen symboltabell, en variabel som deklareras i ett avsnitt från att skriva över värdena för andra variabler med samma namn som deklareras annorstädes I samma program. Faktum är att alla variabler i Perl tillhör ett paket. Variablerna i ett Perl-program hör till huvudpaketet Alla andra paket inom en Perl pr Ogram är antingen kapslade i det här huvudpaketet eller finns på samma nivå Det finns några verkligt globala variabler, såsom signalbehandlaren SIG som är tillgängliga för alla andra moduler i ett applikationsprogram och kan inte isoleras via namnområden Endast de variabla identifierarna startar med bokstäver eller understreck hålls i modulens symbolbord Alla andra symboler, till exempel namnen STDIN STDOUT STDERR ARGV ARGVOUT ENV Inc och SIG, tvingas vara i paketets huvud. Växling mellan paket påverkar endast namnrymden Allt du gör när du Använd ett paket eller en annan är att förklara vilket symbolbord som ska användas som standardtabell för uppslag av variabla namn. Endast dynamiska variabler påverkas av användningen av symboltabeller. Variabler som deklareras av användningen av mitt sökord löses fortfarande med kodblocket de Råkar vara bosatta och refereras inte genom symboltabeller. Faktum är att en paketdeklarations räckvidd fortfarande är aktiv endast i kodblocket är det decl ared in Därför om du byter symboltabeller genom att använda ett paket i en subrutin, kommer den ursprungliga symboltabellen som är i kraft när samtalet gjordes att återställas när subrutinen returneras. Switchen symbol tabeller påverkar endast standarduppslaget av dynamiska variabla namn Du kan Ändå uttryckligen referera till variabler, filhandtag osv i ett specifikt paket genom att lägga ut ett paketnamn i variabelnamnet. Du såg vad ett paketkontext var när man använde referenser i Kapitel 3 Ett paketkontext innebär helt enkelt att symboltabellen används av Perl tolk för att lösa variabla namn i ett program Genom att byta symboltabeller byter du paketets kontext. Moduler kan näts i andra moduler. Den kapslade modulen kan använda variablerna och funktionerna i modulen som är nestad inom För kapslade moduler, skulle du Måste använda modulnamn nestedModuleName och så vidare. Att använda dubbelt kolon är synonymt med att använda en rygg citat. Dubbel kolon är den föredragna, framtida w ay att adressera variabler i moduler. Explicit adressering av modulvariabler görs alltid med en fullständig referens. Anta exempelvis att du har en modul, Investeringar som är standardpaketet som används och du vill adressera en annan modul. Obligationer som är kapslade inuti Investeringsmodulen I det här fallet kan du inte använda Bond I stället borde du använda Investment Bond för att adressera variabler och funktioner inom Bond-modulen. Användning av Bond skulle innebära användning av ett paket Bond som är näst i huvudmodulen och inte inom Investeringsmodul. Symboltabellen för en modul lagras faktiskt i en associativ grupp av modulens namn som bifogas två kolonner. Symboltabellen för en modul som heter Bond kommer att refereras till som den associativa gruppen Bond. Namnet på symboltabellen för Huvudmodulen är huvud och kan till och med förkortas. På samma sätt har alla kapslade paket sina symboler lagrade i associativa arrayer med dubbla kolon som skiljer varje nestnivå. För examen I Bond-modulen som är indelad i Investment-modulen kommer den associativa gruppen för symbolerna i Bond-modulen att kallas Investment Bond. A typeglob är verkligen en global typ för ett symbolnamn. Du kan utföra aliasingoperationer genom att tilldela en typeglob En eller flera poster i en associativ array för symboler kommer att användas när en uppgift via en typglob används Det verkliga värdet i varje post i den associativa arrayen är vad du hänvisar till när du använder variabelnamnetoden Således finns det två sätt av att referera till variabla namn i ett paket Investeringspengar Investeringsräkningar. I den första metoden hänvisar du till variablerna via en typeglobreferens. Användningen av symboltabellen Investeringar är underförstådda här och Perl kommer att optimera uppslaget för symboler pengar och Räkningar Detta är det snabbare och föredragna sättet att adressera en symbol Den andra metoden använder en sökning för värdet av en variabel adresserad av pengar och räkningar i den associativa arrayen som används för symboler , Investeringar explicit Denna uppslag skulle göras dynamiskt och kommer inte att optimeras av Perl Därför kommer uppslaget att tvingas att kolla den associativa arrayen varje gång uttalandet körs. Som ett resultat är den andra metoden inte effektiv och bör endast användas för Demonstration av hur symboltabellen implementeras internt. Ett annat exempel i detta uttalande kamran husain. causes variabler, subrutiner och filhandtag som heter via symbolen kamran för att också adresseras via symbolen husain Det vill säga alla symbolposter i strömmen Symboltabellen med nyckelkamran kommer nu att innehålla hänvisningar till de symboler som adresseras av nyckelhuven För att förhindra en sådan global uppgift kan du använda uttryckliga referenser. Exempelvis kommer följande uttalande att låta dig adressera innehållet i husain via den variabla kamran kamran husain. Alla arrays, såsom kamran och husain, kommer inte att vara densamma Endast vad referenserna specifikt kommer att ändras för att sammanfatta när y Ou tilldela en typeglob till en annan, du påverkar alla poster i ett symbolbord oavsett vilken typ av variabel som avses. När du tilldelar en referens från en variabel typ till en annan påverkar du bara en post i symboltabellen. A Perl Modulfilen har följande formatpaket Modulnamn Infoga modulkod 1. Filnamnet måste ringas Namnet på en modul måste sluta i strängen enligt konventionen Paketuppsättningen är första raden i filen. Den sista raden i filen måste innehålla linje med 1-satsen Detta ger i själva verket ett sant värde till applikationsprogrammet med hjälp av modulen. Användning av 1-satsen kommer inte att låta modulen laddas korrekt. Paketutskottet berättar Perl-tolken att börja med en ny namespace-domän. Dina variabler i ett Perl-skript hör till ett paket som heter Main Varje variabel i huvudpaketet kan kallas huvudvariabel. Här är syntaxen för sådana referenser paketnamn variabelnamn. Singl e citationstecken är synonymt med dubbelpolonoperatören Jag täcker fler användningsområden av operatören i nästa kapitel För tillfället måste du komma ihåg att följande två uttalanden är likvärdiga paketnamn variabelnamn paketnamn variabelnamn. Dubbelkolonsyntaxen anses vara standard i Perl-världen Därför, för att bevara läsbarheten använder jag dubbla kolonnsyntaxen i resten av denna bok om det inte är absolut nödvändigt att göra undantag för att bevisa en punkt. Standardanvändningen av ett variabelnamn försvarar det aktuella paketet aktivt vid den tiden av kompilering Således, om du är i paketet och specificera en variabel pv är variabeln faktiskt lika med Finans pv. Using Perl Modules använder vs require. You inkluderar Perl moduler i ditt program med hjälp av användningen eller kravet uttalande Här är vägen för att använda någon av dessa påståenden använd modulnamn kräver modulnamn. notera att förlängningen inte används i den ovan angivna koden. Observera också att inget uttalande tillåter en fil att inkluderas mer th ett gång i ett program Det returnerade värdet av true 1 som det sista uttalandet är nödvändigt för att låta Perl veta att en require d eller use d-modulen är laddad korrekt och låter Perl-tolken ignorera eventuella reläer. Det är i allmänhet bättre att använda användningsmodulen Uttalande än kravet Modulutlåtande i ett Perl-program för att förbli kompatibelt med framtida versioner av Perl. For moduler kan du överväga att fortsätta använda kravet här. Här är varför Användningsförklaringen fungerar lite mer än vad som krävs i att det ändrar namnet på modulen som innehåller en annan modul. Du vill ha den här extra uppdateringen av namnrymden som ska göras i ett program. När du skriver kod för en modul kanske du inte vill att namnrymden ska ändras om det inte uttryckligen krävs i Den här händelsen kommer du att använda kravet för att kräva. Den krävande uppgiften inkluderar hela filnamnet för en fil i Inc-arrayen så att funktionerna och variablerna i modulens fil är på en känd plats under exe Varningstid Därför importeras de funktioner som importeras från en modul via en explicit modulreferens vid körning med kravet. Användningsuppsättningen gör samma sak som kravet på att den uppdaterar Inc-arrayen med fullständiga söknamn på laddade moduler. Koden För användningsfunktionen går också ett steg vidare och kallar en importfunktion i modulen som används d för att uttryckligen ladda listan över exporterade funktioner vid kompileringstid och därigenom spara tiden som krävs för en explicit upplösning av ett funktionsnamn under utförandet. Användningsutlåtandet motsvarar att kräva modulnamn importmodulnamnslista med importerade funktioner. Användningen av användningsdeklarationen ändrar programmets namnrymd eftersom de importerade funktionsnamnen är infogade i symboltabellen Kravet på förfrågan ändrar inte ditt programs namnområde. Därför, Följande uttalande använder ModuleName. som motsvarar detta uttalande, kräver modulnamn. Funktioner importeras från en modul e via ett samtal till en funktion som kallas import Du kan skriva din egen importfunktion i en modul, eller du kan använda exportörsmodulen och använda dess importfunktion. I nästan alla fall använder du exportörsmodulen för att tillhandahålla en importfunktion i stället för återuppfinna hjulet Du lär dig mer om detta i nästa avsnitt Om du väljer att inte använda Exporter-modulen måste du skriva en egen importfunktion i varje modul som du skriver. Det är mycket lättare att helt enkelt använda Exporter-modulen och låta Perl gör jobbet för dig. Provmodulen. Det bästa sättet att illustrera semantiken för hur en modul används i Perl är att skriva en enkel modul och visa hur man använder den. Låt oss ta exemplet på en lokal lånehaj, Rudious Maximus, som helt enkelt är trött på att skriva samma förfrågan på betalningsbreven. Han är en ivrig fläkt av datorer och Perl. Rudious tar den lata programmeraren s approach och skriver en Perl-modul för att hjälpa honom att skapa sina noteringar och brev. Nu, istället för att skriva in fält i am Emo mallfil är allt han behöver göra att skriva några rader för att producera sin trevliga, hotande notering. Listning 4 1 visar vad han måste skriva Listing 4 1 Använda Brevmodulen 1 usr bin perl - w 2 3 Ovanstående linjen nedan Att inkludera den aktuella dir i Inc 4 push Inc, pwd 5 6 använd Letter 7 8 Brev till Mr Gambling Man, Pengarna till Lucky Dog, Race 2 9 Brev ClaimMoneyNice 10 Letter ThankDem 11 Letter Finish. The användningsbrevet uttalande är närvarande för att tvinga Perl-tolken ska inkludera koden för modulen i applikationsprogrammet. Modulen ska placeras i katalogen usr lib perl5, eller du kan placera den i en katalog som anges i Inc-serien. Inc-arrayen är listan över kataloger som Perl Tolk kommer att leta efter när man försöker ladda koden för den angivna modulen. Den kommenterade radenummer 4 visar hur man lägger till den aktuella arbetsmappen för att inkludera sökvägen. De fyra följande raderna i filen genererar ämnet för brevet. Här är utgången från att använda Brevmodul Till Mr Gambling Man Fm Rudious Maximus, Lån Shark Dt Ons 7 Feb 10 35 51 CST 1996.Re Pengarna till Lucky Dog, Race 2. Det har kommit till min uppmärksamhet att ditt konto är långt över på grund av att du ska betala oss snart Eller vill du att jag ska komma ovah. Thanks for your support. Brevmodulfilen visas i Listing 4 2 Namnet på paketet deklareras i första raden Eftersom de här modulernas funktioner kommer att exporteras använder jag Exporter-modulen därför , Används uttalandet Exporter krävs för att ärva i funktionalitet från exportörsmodulen Ett annat krävs steg är att lägga ordet Exporterad i ISA-arrayen för att tillåta att söka. ISA-arrayen är en specialgrupp inom varje paket Varje objekt i arraylistan där annars till Leta efter en metod om den inte kan hittas i det aktuella paketet Bestämningen i vilket paket är listade i ISA-arrayen är den ordning som Perl söker efter olösta symboler En klass som är listad i ISA-arrayen kallas basklassen av den parti Cular-klassen Perl kommer cache bort saknade metoder som finns i basklasserna för framtida referenser Ändring av ISA-arrayen kommer att spola cacheminnet och få Perl att se upp alla metoder igen. Se nu koden för i Listing 4 2 Listing 4 2 Modulen 1 Paket Brev 2 3 kräver exportör 4 ISA Exporter 5 6 head1 NAMN 7 8 Brev - Provmodul för att generera brevhuvud för dig 9 10 head1 SYNOPSIS 11 12 Använd Brev 13 14 Brev Datum 15 Brev Att namnge, företag, adress 16 17 Då en av Efter 18 Brev ClaimMoneyNice 19 Letter ClaimMoney 20 Letter ThreatBreakLeg 21 22 Letter ThankDem 23 Letter Finish 24 25 head1 BESKRIVNING 26 27 Den här modulen ger ett kort exempel på att generera ett brev för en 28 vänlig neighborbood lånehaj 29 30 Koden börjar efter det klippta uttalandet 31 Klipp 32 33 EXPORT qw Datum 34 Till 35 ClaimMoney 36 ClaimMoneyNice 37 ThankDem 38 Finish 39 40 41 Skriv ut idag s datum 42 43 underbrev Datum 44 datum datum 45 utskrift n Idag är datum 46 47 48 under Brev till 49 Lokal namnskift 50 lokal ämnesskift 51 skriv ut n Namn 52 skriv ut n Fm Rudious Maximus, Lån Shark 53 skriv ut Dt, datum 54 skriv ut Nytt ämne 55 skriv ut 56 tryck nn 57 58 undertecknad ClaimMoney 59 skriv ut n Du är skyldig mig pengar Få din handling tillsammans 60 skriv ut n Vill du att jag ska skicka Bruno över till 61 print n samla in eller ska du betala 62 63 64 underbrevet ClaimMoneyNice 65 skriv ut n Det är uppmärksammat att ditt konto är 66 print n way över förfallodag 67 print n Du ska betala oss snart 68 skriv ut n eller vill du att jag ska komma? 69 70 71 underbrev ThreatBreakLeg 72 skriv ut n tydligen bokstäver som dessa hjälper inte 73 print n Jag måste göra ett exempel på dig 74 skriv ut Nn Se dig på sjukhuset, vän 75 76 77 underbrev TackDem 78 Skriv ut nn Tack för ditt stöd 79 80 81 Underbrev Finish 82 printf nnnn Med vänlig hälsning 83 printf n Rudious n 84 85 86 1.Lines som innehåller samma tecken används för dokumentation Du måste dokumentera varje modul för egen hänvisning Perl-moduler behöver inte dokumenteras men det är en bra idé att skriva några rader om vad din kod gör. Några år från nu kan du glömma vad en modul handlar om Bra dokumentation är alltid ett måste om du vill komma ihåg vad Du gjorde tidigare. Jag täcker dokumentationsstilar som används för Perl i kapitel 8 Dokumentering av Perl-skript För denna provmodul startar head1-dokumentationen dokumentationen Allt upp till det snabba uttalandet ignoreras av Perl-tolken. Näste listas modulen alla funktioner som exporteras av den här modulen i EXPORT-matrisen EXPORT-arrayen definierar alla funktionsnamn som kan ringas av extern kod. Om du inte listar en funktion i EXPORT-gruppen så vinner den inte av externa kodmoduler. Följande EXPORT-array är kodens kropp, en subrutin i taget När alla subrutiner är definierade slutar slutrapport 1 modulfilen 1 måste vara den sista körbara raden i filen. Låt oss titta på några av de funktioner som definieras i denna modul le Den första funktionen att titta på är den enkla Datum-funktionen, raderna 43 till 46, som skriver ut det aktuella UNIX-datumet och tiden. Det finns inga parametrar för den här funktionen och det returnerar inte något meningsfullt tillbaka till den som ringer. Notera användningen av Min före datumvariabeln i rad 44 Min nyckelord används för att begränsa variabelns räckvidd till inom Date-funktionen s-krullningshållare. Kod mellan lockiga hängslen hänvisas till som ett blockvariabler som deklareras inom ett block är begränsade inom ramen för curly braces I 49 och 50 är de lokala variablerna namn och ämne synliga för alla funktioner. Du kan också deklarera variabler med den lokala kvalifieraren. Användning av lokal gör det möjligt för en variabel att omfatta det nuvarande blocket och för andra block av Kod som kallas från det här blocket Således är en lokal x deklarerad inom ett block synlig för alla efterföljande block som kallas från det här blocket och kan refereras i följande provkod kan namnervariabeln för ToTitled-funktionen få åtkomst Ed men inte data i iphone 1 sub Letter ToTitled 2 lokal namnskift 3 min telefonskift. Provkoden för visade hur man extraherar en parameter i taget. Underrutinen Till tar två parametrar för att ställa in rubriken för memo. Using funktioner Inom en modul är det inte annorlunda än att använda och definiera Perl-moduler inom samma kodfil Parametrar skickas genom referens om inget annat anges Multipla arrayer som skickas in i en subrutin, om inte explicit avlägsnas med hjälp av backslash, sammanfogas. Inmatningsraden i en funktion Är alltid en uppsättning av skalärvärden. Passande värden genom referens är det föredragna sättet i Perl att skicka en stor mängd data till en subrutin. Se Kapitel 3 Referenser. En annan provmodul Finans. Finansmodulen, som visas i Listning 4 3, används för att Ge enkla beräkningar för lånevärden Användning av finansmodulen är enkel Alla funktioner skrivs med samma parametrar, som visas i formeln för funktionerna. Låt oss titta på hur Det framtida värdet av en investering kan beräknas Till exempel, om du investerar några dollar, pv i ett obligationslån som erbjuder en fast procentuell räntesats, tillämpas r vid kända intervaller under n tidsperioder, vad är värdet av bindningen vid tidpunkten för Dess utgångsdatum I det här fallet kommer du att använda följande formel fv pv 1 r n. Funktionen för att få framtidens värde deklareras som FutureValue. Se Listning 4 3 för att se hur du använder den. Listning 4 3 Använda finansmodulen 1 usr bin perl - w 2 3 push Inc, pwd 4 användning Ekonomi 5 6 lån 5000 00 7 apr 3 5 april 8 år 10 år 9 10 -------------------- -------------------------------------------- 11 Beräkna värdet vid Slutet av lånet om ränta 12 tillämpas varje år 13 -------------------------------------- -------------------------- 14 tid år 15 fv1 Finansiering FutureValue lån, apr, tid 16 print n Om räntan tillämpas senast 17 Print n Det framtida värdet för ett lån på lån n 18 skriv ut på en APR av, april för tid, år 19 printf är 8 2f n fv1 20 21 --------------------------------------------- ------------------- 22 Beräkna värdet vid slutet av lånet om ränta 23 tillämpas varje månad 24 ------------- -------------------------------------------------- - 25 ränta 12 april 26 april år 12 i månader 27 fv2 Finans FutureValue lån, ränta, tid 28 29 print n Om ränta tillämpas vid slutet av varje månad 30 utskrift n Det framtida värdet på ett lån på lån n 31 skriv ut på en APR av, april för, tid, månader 32 printf är 8 2f n fv2 33 34 printf n Skillnaden i värde är 8 2f, fv2 - fv1 35 printf n Därför genom att tillämpa räntor på kortare tidsperioder 36 blir vi faktiskt mer Pengar i intresse n. Här är provinmatning och utmatning av Listing 4 3 testme. Om ränta tillämpas vid årsskiftet Det framtida värdet för ett lån på 5000 till ett APR på 3 5 i 10 år är 7052 99. Om ränta tillämpas i slutet av varje månad Det framtida värdet på ett lån på 5000 på en APR på 3 5 i 120 månader är 7091 72. Skillnaden i n-värdet är 38 73 Därför får vi genom rent intresse på kortare tidpunkter faktiskt mer pengar i intresse. Uppenbarelsen i produktionen är resultatet av jämförelsen av värden mellan fv1 och fv2 Fv1-värdet beräknas med tillämpning av räntan en gång Varje år under obligationslivet fv2 är värdet om räntan tillämpas varje månad till motsvarande månatliga räntesats. Paketet visas i Notering 4 4 i dess tidiga utvecklingsfaser. Listning 4 4 Paket 1-paketet Finans 2 3 kräver Exportör 4 ISA Exporter 5 6 head1 7 8 Financial Calculator - Finansiella beräkningar görs enkelt med Perl 9 10 huvud 2 11 användning Finans 12 13 pv 10000 0 14 15 ränta 12 5 12 APR per månad 16 17 tid 360 månader för lån till mogna 18 19 Fv FutureValue 20 21 print fv 22 23 cut 24 25 EXPORT qw FutureValue, 26 PresentValue, 27 FVofAnnuity, 28 AnnuityOfFV, 29 getLastAverage, 30 getMovingAverage, 31 SetInterest 32 33 34 Globala, om någon 35 36 37 lokal standardInterest 5 0 38 3 9 sub Finance SetInterest 40 min kursförskjutning 41 defaultInterest rate 42 printf n defaultInterest rate 43 44 45 ------------------------------- ------------------------------------- 46 Noter 47 1 Räntan r anges i ett värde Av 0-100 48 2 Den n som anges i villkoren är den takt som räntan 49 appliceras på 50 51 -------------------------- ------------------------------------------ 52 53 ------ -------------------------------------------------- ------------ 54 Nuvärdet av en investering som ges 55 fv - ett framtida värde 56 r - kurs per period 57 n - antal period 58 ------------ -------------------------------------------------- ------ 59 sub Finance FutureValue 60 min pv, r, n 61 min fv pv 1 r 100 n 62 retur fv 63 64 65 ------------------- ------------------------------------------------- 66 Nuvärdet av en investering givet 67 fv - ett framtida värde 68 r - skattesats per period 69 n - antal period 70 ------------------------- ------------------------------------------- 71 sub Finans PresentValue 72 min pv 73 min fv, r, n 74 pv fv 1 r 100 n 75 retur pv 76 77 78 79 ------------------------ -------------------------------------------- 80 Få det framtida värdet av en livränta ges 81 mp - Månatlig betalning av livränta 82 r - skattesats per period 83 n - antal period 84 --------------------------- ----------------------------------------- 85 86 sub FVofAnnuity 87 min fv 88 my enR 89 min mp, r, n 90 91 oneR 1 rn 92 fv mp oneR - 1 r 93 return fv 94 95 96 ------------------------ -------------------------------------------- 97 Få livränta från Följande bitar av information 98 r - hastighet per period 99 n - antal period 100 fv - framtida värde 101 ---------------------------- ---------------------------------------- 102 103 under AnnuityOfFV 104 min mp mp - Månadsvis Betalning av livränta 105 my oneR 106 min fv, r, n 107 108 oneR 1 rn 109 mp fv r oneR - 1 110 returnera mp 111 112 113 ------------------- ------------------------------------------------- 114 Få medelvärdet av t han senar n värden i en matris 115 ------------------------------------------ -------------------------- 116 Det sista antal räkneantalet från matrisen i värden 117 Det totala antalet element i värden är i nummer 118 119 sub getLastAverage 120 mitt tal, antal, värden 121 my i 122 123 min a 0 124 retur 0 om räkning 0 125 för i 0 jag räknar i 126 a värden nummer - i - 1 127 128 returnera ett tal 129 130 131 --- -------------------------------------------------- --------------- 132 Få ett glidande medelvärde av värdena 133 -------------------------- ------------------------------------------ 134 Fönstret är den första parametern , antalet poster i den 135 passerade matrisen är nästa Det här kan enkelt beräknas inom 136-funktionen med skalärfunktionen, men den nedan angivna subrutinen används också för att illustrera hur man ska skicka pekare. Referensen till 138-värdet av värden passeras nästa, följt av en hänvisning till platsen 139, kommer returvärdena att lagras 140 141 sub getMovingAve 142 mitt antal, antal, värden, movingAve 143 min i 144 min a 0 145 min v 0 146 147 retur 0 om räkning 0 148 retur -1 om räkning nummer 149 retur -2 om räkning 2 150 151 movingAve 0 0 152 movingAve Antal - 1 0 153 för i 0 jag räknar i 154 v-värden i 155 av räkne 156 movingAve i 0 157 158 för jag räknar i nummer i 159 v-värden i 160 av räkning 161 v värden i - räkning - 1 162 a-v räkning 163 movingAve ia 164 165 returnera 0 166 167 168 1.Hitta på deklarationen av funktionen FutureValue med de tre dollar tecknen tillsammans betyder att tre skalär tal som skickas in i funktionen Denna extra scoping är närvarande för att validera typen av parametrar som passerat in i Funktion Om du skulle skicka en sträng i stället för ett nummer i funktionen skulle du få ett meddelande som mycket liknar det här För många argument för Finance FutureValue vid rad 15, nära tiden Utförande av avbruten på grund av kompileringsfel. Användningen av prototyper När du definierar funktioner hindrar dig från att skicka in va lues annat än vad funktionen förväntar sig Använd eller för att passera i en uppsättning värden Om du refererar till referens, använd eller för att visa en skalärreferens till en array eller hash. Om du inte använder backslash, alla andra typer i prototypen för argumentlistan ignoreras Andra typer av diskvalificatorer inkluderar en ampersand för en referens till en funktion, en asterisk för vilken typ som helst och en semikolon för att indikera att alla andra parametrar är valfria. Nu ska vi titta på funktionsdeklarationen sistMovingAverage, som anger två heltal i fronten följt av en matris Så här används argumenten i funktionen är att ange ett värde till var och en av de två skalärerna, räkna och siffran medan allt annat skickas till matrisen Se på funktionen getMovingAverage för att se hur två arrays skickas för att få det glidande genomsnittsvärdet på en lista över värden. Vägen att ringa getMovingAverage-funktionen visas i Listing 4 5 Listing 4 5 Använd den glidande genomsnittsfunktionen 1 usr bin perl - w 2 3 tryck I nc, pwd 4 användning Finans 5 6 värden 12,22,23,24,21,23,24,23,23,21,29,27,26,28 7 mv 0 8 storlek skalärvärden 9 utskrift n Värden att arbeta med n 10 skriv ut Antal värden storlek n 11 12 ---------------------------------------- ------------------------ 13 Beräkna medelvärdet av ovanstående funktion 14 ----------------- ----------------------------------------------- 15 ave Finance getLastAverage 5, storlek, värden 16 utskrift n Medelvärde de senaste 5 dagarna ave n 17 18 Finansiering getMovingAve 5, storlek, värden, mv 19 utskrift n Flyttande medelvärde med 5 dagars fönster n n. Här s utmatningen från Listing 4 5 Värden att arbeta med Antal värden 14. Användning av de senaste 5 dagarna 26 2.The getMovingAverage-funktionen tar två skalar och sedan två referenser till arrays som skalare Inom funktionen avlägsnas de två skalärna till arraysna för användning som numeriska arrays. Den returnerade uppsättningen värden Infogas i det område som passerat som den andra referensen Hade ingångsparametrarna inte angivna med för varje refererad grupp, movingAve-arrayreferensen skulle ha varit tom och skulle ha orsakat fel vid körning Med andra ord är följande deklaration inte korrekt under getMovingAve. Den resulterande spolen för felmeddelanden från en dålig funktion prototyp är enligt följande Användning av uninitialiserat värde vid rad 128 Användning av Oinitialiserat värde vid rad 128 Användning av oinitialiserat värde vid rad 128 Användning av oinitialiserat värde vid rad 128 Användning av oinitialiserat värde vid rad 128 Användning av oinitialiserat värde vid rad 133 Användning av oinitialiserat värde vid ledning 135 Användning av oinitialiserat värde vid rad 133 Användning av oinitialiserat värde vid rad 133 value at line 135 Use of uninitialized value at line 133 Use of uninitialized value at line 135 Use of uninitialized value at line 133 Use of uninitialized value at line 135 Use of uninitialized value at line 133 Use of uninitialized value at line 135 Use of uninitialized value at line 133 Use of uninitialized value at line 135 Use of uninitialized value at line 133 Use of uninitialized value at line 135 Use of uninitial ized value at line 133 Use of uninitialized value at line 135 Use of uninitialized value at line 133 Use of uninitialized value at line 135.Average of last 5 days 26 2.Moving Average with 5 days window. This is obviously not the correct output Therefore, it s 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 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. Here s 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 0 24 defaultInterest rate 25 printf n defaultInterest rate 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 variable s 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 usr bin perl - 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 n ------------------------------------------------ 11 fv Finance FVofAnnuity monthly, rate, time 12 printf n For a monthly 8 2f at a rate of 6 2f for d periods , 13 monthly, rate, time 14 printf n you get a future value of 8 2f , fv 15 16 fv 1 1 allow 10 gain in the house value 17 18 mo Finance AnnuityOfFV fv, rate, t ime 19 20 printf n To get 10 percent more at the end, i e 8 2f , fv 21 printf n you need a monthly payment value of 8 2f , mo, fv 22 23 print n ------------------------------------------------ n. 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 You ll learn more on the object-oriented features of Perl in Chapter 5 Object-Oriented Programming in Perl 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 Here s the b asic syntax SuperClass NextSubClass ThisClass. The file for these is stored in SuperClass NextSubClass 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 Here s how to structure the hierarchy, assuming you are in the usr lib perl5 directory. Create a Money directory under the usr lib perl5 directory. Copy the existing file into the Money subdirectory. Create the new file in the Money subdirectory. Edit the 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 file in the usr lib perl5 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 usr bin perl - w 2 aa pwd 3 aa Money 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 n Values to work with n 10 print Number of values size n 11 ---------------------------------------------------------------- 12 Calculate the average of the above function 13 ---------------------------------------------------------------- 14 ave Money Finance getLastAverage 5, size, values 15 print n Average of last 5 days ave n 16 Money Finance getMovingAve 5, size, values, mv 17 foreach i values 18 print n Moving with 5 days window mv i n 19 20 print n Moving Average with 5 days window n n. Lines 2 through 4 add the path to the Money subdirectory The use statement in line 5 now addresses the file in the Money subdirectory The calls to the functions within are now called with the prefix Money Finance instead of Finance Therefore, a new subdirectory is shown via the symbol when Perl is sear ching for modules to load. The 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 file is shown in Listing 4 8 Listing 4 8 The superclass module for 1 package Money 2 require Exporter 3 4 BEGIN 5 printf n Hello Zipping into existence for you n 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 module, you use this line use Money Stocks. The file appears in the Money subdirectory and is defined in the same format as the 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 usr lib perl 5 lib 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, Perl Module Archives, for a complete list of these standard modules. To find out all the modules installed on your system, issue the following command If you get an error, add the usr lib perl5 directory to your path find usr lib perl5 - name perl - 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 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 and. 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 som e 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.Moving Average. I have hundreds of thousands of data points stored in data and need to do 100 data point moving average Can anybody share the logic I know I have to do pop or shift but just can t figure out how to do the moving average. thanks in advance. RE Moving Average. KevinADC TechnicalUser 18 Sep 08 16 28.I think you are going to need to explain what you are trying to do in detail Or maybe some knows wh at 100 data point moving average means Sample in and sample out data will be helpful. RE Moving Average. rharsh TechnicalUser 18 Sep 08 16 31.There are a few different ways to define a moving average Not in terms of perl since that s your question what algorithm would you use to calculate the moving average. For example, a simple moving average for 100 data points would be something like. SMA p p-1 p-99 100.Is that what you re looking for. RE Moving Average. PinkeyNBrain IS IT--Management 18 Sep 08 17 02.This looks a little academic, so just in case I ll explain versus writing code here - Loop over your data pushing the data points into an array - Track a runningtotal of the values along the way - If size of array 99, goto start - calc print average - shift array and subtract that amount from your runningtotal - end of loop. Red Flag Submitted. Thank you for helping keep Tek-Tips Forums free from inappropriate posts The Tek-Tips staff will check this out and take appropriate action. Reply To Th is Thread. Posting in the Tek-Tips forums is a member-only feature. Click Here to join Tek-Tips and talk with other members.
Comments
Post a Comment