Gå til innhold

Vurderer å dra igang noen perl tutorials her


Anbefalte innlegg

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
Videoannonse
Annonse

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

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

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 :thumbup:

Lenke til kommentar

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
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
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 av DrDoogie
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...