Låter som konstig uppgift att ge er helt ut utan vägledning.
Men om det är en CSV-fil, får ni använda moduler som tex Text::CSV, isf är det otroligt lätt(*). Nu gav du inget exempel på hur CSV-filen ser ut men jag säger att den ska se ut så här:
Kod:
kungen,10,2016-02-17
tarp,7,2016-02-16
silvia,1,2015-12-24
refat,2,2005-03-12
Inloggningsnamn, antal inloggningar, senaste inloggningen.
Parsa datan:
Kod:
use strict;
use warnings;
use Text::CSV;
my $filename = "/fil/som/innehåller/csv-datan"
my $c = Text::CSV->new();
open(my $fh, "<", $filename) or die $!;
my @data = ();
while( (my $arr = $c->getline($fh)) ) {
push @data, {
name => $arr->[0],
num => $arr->[1],
lastTime => $arr->[2],
};
}
close($fh);
Koden öppnar $filename och läser in datan till en array @data. Varje element i arrayen är ett hash med olika nycklar (array of hashes). Man skulle kunnat spara det som en array of array men tycker det är lättare senare med namngivna nycklar istället för [0], [1] etc.
Sen för att sortera och skriva ut det på antal inloggningar (fallande).
Kod:
foreach my $item ( sort {$b->{'num'} <=> $a->{'num'} || $a cmp $b} @data ) {
printf("%s: %d\n", $item->{'name'}, $item->{'num'});
}
En liten förklaring kanske. sort-syntaxen ser kanske lite mysko ut vid första ögonkastet. "$a" och "$b" är speciella variabler inne i en "sort {} @array". De är helt enkelt de två element som den just nu försöker sortera ur @array. "$a" är det första och "$b" det andra, "<=>" är numerisk jämförelse.
Så den första delen "$b->{'num'} <=> $a->{'num'}" betyder helt enkelt att den jämför "num"-elementen i data med varandra och stoppar det högre först (då $b är före $a).
"||" är vad den ska göra om den hittar två lika värden. Då går den vidare och kör "$a cmp $b", "cmp" här är alfabetisk sortering. Så den sorterar alfabetiskt stigande (då $a är före $b).
(*): Om ni inte får köra med Text::CSV, fråga varför. Modulerna till Perl är otroligt bra och det finns otroligt många, att inte köra de när de finns är bara dumheter. När man ska lära sig ett språk så är ju syntaxen nästan banal i jämförelse med att lära sig moduler och liknande.
men om de verkligen inte får så kan du göra en simpel regexpsökning som inte kommer ta allt men det mesta.
Kod:
while( defined(my $line = <$fh>) ) {
if( $line =~ /^([^,]+),([^,]+),(.+)$/xms ) {
push @data, {
name => $arr->[0],
num => $arr->[1],
lastTime => $arr->[2],
};
}
}