DrDoogie Skrevet 5. desember 2003 Del Skrevet 5. desember 2003 Hepp! Lurer på om det er stemning for å kjøre igang med litt perl-leksjoner. For å 1)lodde stemningen for dette, og 2)ta pulsen på hvor nivået ligger innen programmering generelt (og perl spesielt) hos dem som er interessert i å følge med på noen tuts, poster jeg derfor en kodesnutt som jeg håper ikke er hverken for enkel eller for komplisert. Det er da ønskelig med tilbakemeldinger på dette innspillet. Er det sterk interesse, vil jeg se nærmere på hva jeg kan bidra med, etter jul. #! /usr/bin/perl # This file is meant to convert .cue-files to .xml-files. use strict; use warnings; my %cue_info; my ($album_artist, $album_title, $track_number, $indice, $rec); my (@tracks, @artists, @indices); ::read_cue(); ::print_out(); sub read_cue { while (<>) { chomp; PARSER: { m/^PERFORMER\ "(.*)"/ && do { $album_artist = $1; }; m/^TITLE\ "(.*)"/ && do { $album_title = $1; }; m/\ {2}TRACK\ (\d\d)/ && do { $track_number = int($1); }; # Numbering of tracks starts at '01' m/\ {4}TITLE\ "(.*)"/ && do { $tracks[$track_number-1] = $1; }; # Whether the performer listed for all tracks is the same as the albumperformer # or not is not our concern here m/\ {4}PERFORMER\ "(.*)"/ && do { $artists[$track_number-1] = $1; }; m/\ {4}INDEX\ (\d\d)\ (\d\d):(\d\d):(\d\d)/ && do { # Added for clarity and great justice $indice = int($1); # Calculation to get total samples(ss) instead of MM:SS:ss # Numbering of indices starts at '00' $indices[$track_number-1][$indice] = (60*$2+$3)*75+$4; }; } } $rec = { artist => $album_artist, album => $album_title, tracks => [@tracks], artists => [@artists], indices => [@indices] # The array is multidimentional; the list becomes a list of references to arrays }; # The unique identifier (key) is "artist_album" $cue_info{$album_artist . "_" . $album_title} = $rec; }; sub print_out { ::print_xml_header(); foreach my $key (sort keys %cue_info) { print "<ENTRY>\n"; print "<ALBUMARTIST>", $cue_info{$key}->{artist}, "</ALBUMARTIST>\n"; print "<ALBUMTITLE>", $cue_info{$key}->{artist}, "</ALBUMTITLE>\n"; foreach my $track (0..scalar @{$cue_info{$key}->{tracks}} - 1) { print "<TRACKTITLE NUMBER=\"", sprintf ("%.2d", $track + 1), "\">", @{$cue_info{$key}->{tracks}}[$track], "</TRACKTITLE>\n"; # We are assuming that the trackinfo has tracktitles and trackperformers in pairs, # meaning that the index for a tracktitle can be used to get the trackperformer from ITS DIFFERENT ARRAY print "<TRACKARTIST>", @{$cue_info{$key}->{artists}}[$track], "</TRACKARTIST>\n"; #foreach my $index (0..scalar @{$cue_info{$key}->{indices}[$track]} - 1) { foreach my $index (0..scalar @{$cue_info{$key}->{indices}[$track]} - 1) { # Dial "911-Job Security" for an explanation of this line. Operators are standing by. print "<INDICE NUMBER=\"", sprintf ("%.2d", $index), "\">", @{$cue_info{$key}->{indices}}[$track]->[$index], "</INDICE>\n" if defined @{$cue_info{$key}->{indices}}[$track]->[$index]; } } print "</ENTRY>\n"; } }; sub print_xml_header { print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; }; Lenke til kommentar
tvangsgreie Skrevet 5. desember 2003 Del Skrevet 5. desember 2003 Det vanlige er at tutorials begynner med print "Hello world!\n"; og så utvikler seg derfra. Programmet ditt er forøvrig noe rotete. Når du deklarerer en haug med variabler i main, og så bruker dem i funksjoner, blir det i praksis som om du bare bruker globale variable, og det gjør det tungvint å følge datastrømmen. Du bør enten sende og hente ut det du skal bruke som parametre, eller lage et objekt, med operatorer på det. Annet: - Du ville sansynligvis også komme bedre ut av det om du bruker et XML-bibliotek, både i forhold til komplisitet på koden, og korrekthet av XML. - $cue_info{$key}->{artist} blir brukt for å skrive ut tittel, det er neppe riktig. Lenke til kommentar
huf Skrevet 5. desember 2003 Del Skrevet 5. desember 2003 Har planer om å lære meg perl nå, så hadde satt stor pris på om noen hadde laget tutorials som var nybegynner vennlige. Den som du skrev der DrDoogie var ikke det da, men kanskje noen andre vil skrive en som får mej til å komme i gang? Har null erfaring med perl. Ørlite erfaring med java, og kan html og css godt. Lenke til kommentar
moesen Skrevet 5. desember 2003 Del Skrevet 5. desember 2003 Hvorfor ikke begynne helt ifra start? F.eks tvangsgreie nevnte; Hello world. Skjønte ikke stort av den koden der, enda for en tid tilbake holdt jeg på å leste en tutorial... Lenke til kommentar
huf Skrevet 5. desember 2003 Del Skrevet 5. desember 2003 Hvorfor ikke begynne helt ifra start? F.eks tvangsgreie nevnte; Hello world.Skjønte ikke stort av den koden der, enda for en tid tilbake holdt jeg på å leste en tutorial... Enig. Lenke til kommentar
moesen Skrevet 5. desember 2003 Del Skrevet 5. desember 2003 Forslag til en enkel start: Hello World program, det enkleste programmet du kan skrive i perl vil jeg tro. Uansett, slik er det: #!/usr/bin/perl print "hello world\n"; #!/usr/bin/perl <---Viser hvor programmet skal finne perl print "hello world\n"; <---Skriver ut hello world. print brukes til og printe ut text. Slike ting som "\n" er det samme som new line, altså ny linje. Den ber programmet hoppe en linje ned etter at hello world er skrevet til skjermen. Stort sett alle linjer skal avsluttes med ; Mestepraten av texten som skrives ut skal skrives i " ". For å kunne bruke slike kommandoer som \n må du skrive det inni " ". Hvis du skal skrive ut "ren" text så kan du lik så rett bruke ' '. Men hvis du bruker ' ' i stedet for " " så kan du ikke bruke \n. For å kunne kjøre perl programmer rett må du lagre de som programnavn.pl Kort om variabler: #!/usr/bin/perl print "Hva heter du?\n "; $navn=<STDIN>; chomp $navn; print "Heisann $navn\n"; Variabler er "ting" som lagrer f.eks text. Her heter variabelen for $navn. Ved bruk av små variabler bruker man $ før variabelnavnet. Skal du lagre litt mer i en og samme variabler kan du bruke @ i stedet for $. Forklaring av program: #!/usr/bin/perl <---som sagt, det viser programmet hvor det skal finne perl print "Hva heter du?\n"; <---Skriver "Hva heter du?" til skjermen. Print vet du jo hva brukes til (?). Og samme med \n(Håper jeg). $navn=<STDIN>; <---"<STDIN> brukes når DU skriver til programmet når programmet kjører. Da mottar <STDIN> det du skriver og lagrer det i angitt variabel, her heter den angitte variabelen for $navn. chomp $navn; <----Her kuttes linjeskift, vet ikke helt hvordan jeg skal forklare det men du kan prøve uten og se print "Heisann $navn\n"; <----printer Heisann "det-navnet-som-ble-skrevet-inn" til skjermen. Skal du bruke variabler må du bruke " variabel". Du _må_ huske å sette variablene i anførselstegn (" "). Dette var bare ett eksempel på en lettere start en det du starten med. Jeg personlig foretrekker en lettere start.... Fint at du prøver og lager en tutorial ihvertfall, keep up the good work Lenke til kommentar
huf Skrevet 5. desember 2003 Del Skrevet 5. desember 2003 Hva er det man trenger å legge inn i windows for å kjøre perl dokumenter fra ledeteksten? når jeg skrver perl blablabla.pl så kommer det bare at perl ikke er en intern eller extern kommando..blabla.. er det noe jeg må legge inn først? Lenke til kommentar
moesen Skrevet 6. desember 2003 Del Skrevet 6. desember 2003 Hva er det man trenger å legge inn i windows for å kjøre perl dokumenter fra ledeteksten? når jeg skrver perl blablabla.pl så kommer det bare at perl ikke er en intern eller extern kommando..blabla.. er det noe jeg må legge inn først? Ehh... Perl er først og fremst til Linux. Når jeg brukte perl i windows brukte jeg en liten distro som kaltes Cygwin. Der kjørte jeg mine programmer. Ellers så brukte jeg Linux. Og en ting, lagre programmet ditt som programnavn.pl. så bør du skrive "chmod 755 navn.pl" og start programmet. ("./programmnavn" eller bare "programmnavn.pl" I linux... Det finnes sikkert andre alternativer til perl i windows. Bl.a lagre det som ett cgi program og bruke det på nettet. Men det er kanskje uaktuelt... Lenke til kommentar
huf Skrevet 6. desember 2003 Del Skrevet 6. desember 2003 Neida, men jeg bare lurte på hvordan dette var i win. Jeg er ivrig bruker av linux jeg, så det er ikke noe problem. Lenke til kommentar
Torbjørn Skrevet 6. desember 2003 Del Skrevet 6. desember 2003 for å kjøre det i windows, gjør følgende: *) finn katalogen du har installert perl i, typick C:\perl\bin *) Control Panel -> System -> Advanced -> Environment Variables -> Velg Path, trykk Edit -> Legg til ;C:\perl\bin -> trykk OK Lenke til kommentar
huf Skrevet 6. desember 2003 Del Skrevet 6. desember 2003 *) finn katalogen du har installert perl i, typick C:\perl\bin Der har du jo akkurat det jeg spurte om! Er det noe jeg må legge inn altså? Eller har jeg misforstått dette fullstendig? Lenke til kommentar
Torbjørn Skrevet 6. desember 2003 Del Skrevet 6. desember 2003 ja, perl må installeres. som espen (moesen) sier, er perl og en haug med andre skriptespråk en naturlig del av linux distroer hvis man har tilgang til det. for windows er activestate perl det beste (visstnok), det fåes her: http://www.activestate.com/Products/ASPN_Perl/ skal være en download link der et sted. Lenke til kommentar
DrDoogie Skrevet 8. desember 2003 Forfatter Del Skrevet 8. desember 2003 (endret) Når du deklarerer en haug med variabler i main, og så bruker dem i funksjoner, blir det i praksis som om du bare bruker globale variable, og det gjør det tungvint å følge datastrømmen. Du bør enten sende og hente ut det du skal bruke som parametre, eller lage et objekt, med operatorer på det. Annet: - Du ville sansynligvis også komme bedre ut av det om du bruker et XML-bibliotek, både i forhold til komplisitet på koden, og korrekthet av XML. - $cue_info{$key}->{artist} blir brukt for å skrive ut tittel, det er neppe riktig. Takker for kritikk. Setter stor pris på blodslakt forresten, så det er bare å spa på. * Sending av data mellom funksjoner istedenfor globalt amatørmesterskap: Enig. Dog vil jeg gjerne presse frem som en ynkelig unnskyldning at dette var ment å lodde dybden, og at jeg derfor med vilje gjorde enkelte ting litt "mindre bra". * Korrekthet av XML: Delvis enig. Det enkle skal være enkelt, og selv bruker jeg ikke XML til noe enda. Plus (som nok en ynkelig unnskyldning) var dette det andre programmet hvor jeg har skrevet ut noe XML, og det ble gjort ei natt da jeg hadde bakrus og ikke fikk sove. * Cueinfo yatta yatta... Hvor? Takker ellers for tilbakemelding, satser på å ha klar ei liste over programmeringseksempler etter jul. Tanken er da at folk skal si hva dem ønsker å høre om. Endret 8. desember 2003 av DrDoogie Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå