SkÃ¥ne Sjælland Linux User Group - http://www.sslug.dk Forside   Tilmelding   Postarkiv   Forum   Kalender   Søg
MhonArc Dato: [Date Prev] [Kronologisk oversigt] [Date Next]   TrÃ¥d: [Date Prev] [Oversigt trÃ¥de] [Date Next]   MhonArc
 

Re: [PERL] return i subfunctions



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


 
Forside   Tilmelding   Postarkiv   Oversigt   Kalender   Søg

 
 
Henvendelse vedrørende websiderne til <www_admin>. Senest ændret 2005-08-10, klokken 19:51
Denne side vedligeholdes af MHonArc .