|
|||||||||||||||||||||||||||
Thomas Mejer Hansen wrote:
>
> sub get_protocol {
> [...]
> return $packs;
> return $bytes;
> }
Hmmm..
Här är egentligen två "fel" som jag ser det:
1) Du försöker göra TVÅ return efter varandra från samma subrutin.
När programmet kommer till den första return, så hoppar den
naturligtvis genast ur subrutinen, och den andra return exekveras
aldrig.
2) Du försöker returnera två listor med en return.
Detta är i praktiken omöjligt eftersom Perl passar argumet och
returvärden mellan subrutiner som en lista. Jag illustrerar denna
poäng med ett exempel:
=====================
#!/usr/bin/perl
use strict;
my (@list1,@list2) = ret_list();
my $l;
foreach $l (@list1)
{
print "list1: $l\n";
}
foreach $l (@list2)
{
print "list2: $l\n";
}
print "done\n";
sub ret_list
{
my (@locallist1, @locallist2);
@locallist1 = (1,2,3,4);
@locallist2 = (5,6,7,8);
return(@locallist1,@locallist2);
}
========================
kommer att ge
list1: 1
list1: 2
list1: 3
list1: 4
list1: 5
list1: 6
list1: 7
list1: 8
done
Som du ser så är det bara list1 som får värden, trots att ret_list
"försöker" att returnera två listor.
Lösningen på detta är att returnera referenser till listor, och
sedan dereferentiera dessa. Jag ger ditt program som exempel på hur
du
passar/derefentierar referenser till listor:
========================
#!/usr/bin/perl
#
$logfiles="./";
$tcp="http.log";
($packref,$byteref)=get_protocol("http"); #ta emot REFERENSER
@httppacks = @$packref; #Dereferentiering
@httpbytes = @$byteref; #Dereferentiering
print "Outside Sub Function : \n";
print "packs @httppacks \n";
print "bytes @httpbytes \n";
sub get_protocol {
my (@packs);
my (@bytes);
open(PRO, "cat $logfiles/$tcp | grep @_[0]|");
print "Check for @_[0]!\n\n";
$line=0;
while (<PRO>) {
++$line;
@p=split(/\s+/,$_,5);
$packs[$line]=$p[1];
$bytes[$line]=$p[3];
}
close PRO;
print "Within Sub Function :\n";
print "packs @packs \n";
print "bytes @bytes \n\n";
return (sslug@sslug,sslug@sslug); # Returnera REFERENSER till listorna
# return $bytes;
}
========================
Referenser fungerar lite som pekare i C, fast mycket bättre :)
Om du vill veta mer om referenser kan du läsa s.244 i kamelbibeln
eller man perlref.
Ett tips: perl -w och use strict hjälper en att finna många fel innan de
utvecklas till riktiga rysare! (du borde nog se upp lite med din open :)
/Henrik
|
||||||||||||||
|
||||||||||||||