Schrift
[thread]1492[/thread]

Code evaluation

Leser: 1


<< >> 7 Einträge, 1 Seite
esskar
 2004-02-27 06:03
#14354 #14354
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
sub _toporretr
{
  my($self, %args) = @_;

  my $msgidx = $args{MSGID} || 1;
  my $lines = $args{LINES} || 0;
  my $cmd = $args{CMD};
  my $fh = $args{FH};
  my $nohead = $args{NOHEAD};

  $lines =~ /\d+/ or $lines = 0;

  if($cmd eq POP3CMD_TOP) { $self->print(POP3CMD_TOP." $msgidx $lines", $self->eol()); }
  else { $self->print(POP3CMD_RETR." $msgidx", $self->eol()); }

  my $line = $self->getline();
  chomp $line;

  my $buflen = 0;

  $line =~ /^\+OK/ or $self->message("Bad return from $cmd: $line") and return;
  $line =~ /^\+OK (\d+) / and $buflen = $1;

  my $retval = '';
  while(defined($line = $self->getline()))
  {      
     unless($nohead)
     {
        $line =~ /^\.\s*$/ and last;
        $line =~ s/^\.\././;
        $fh ? (print $fh $line) : ($retval .= $line);
     }
     $nohead and $line =~ /^\s*$/ and $nohead = 0;
  }

  return $fh ? 1 : wantarray ? split(/\r?\n/, $retval) : $retval;
}

sub header
{
  my($self, $msgid, $lines, $fh) = @_;

  return $self->_toporretr(CMD => POP3CMD_TOP, MSGID => $msgid, LINES => $lines, FH => $fh);
}

sub header_body
{
  my($self, $msgid, $fh) = @_;

  return $self->_toporretr(CMD => POP3CMD_RETR, MSGID => $msgid, FH => $fh);
}

sub body
{
  my($self, $msgid, $fh) = @_;

  return $self->_toporretr(CMD => POP3CMD_RETR, MSGID => $msgid, FH => $fh, NOHEAD => 1);
}


Wie findet ihr diesen code? Was macht er eurer Meinung nach?

PS: Ist von mir! Will nur mal schauen, wie ihr es machen würdet und vielleicht auch warum?!?\n\n

<!--EDIT|esskar|1077854904-->
esskar
 2004-02-27 14:08
#14355 #14355
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
okay... rätselraten ist wohl nicht angesagt! :p
Ronnie
 2004-02-27 14:23
#14356 #14356
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Sorry, esskar - sieht so aus als sollten Emails per POP3 abgeholt werden, entweder nur die Kopfzeilen, Kopf- und Body, oder nur Body. Was willst du den genau rausfinden?
coax
 2004-02-27 22:50
#14357 #14357
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
Meiner Meinung nach kann man ueber 3 Subroutinen wahlweise den Body, den Head oder beide holen, dabei wird anhand des Vorkommenes eines Filehandles angegeben ob die Zeilen in eine Datei geschrieben oder der Rueckgabewert der Funktion sein werden.
Ich wuerde _toporretv immer die Zeilen zurueckgeben lassen und zusaetzlich eine Subschreiben die das in die Datei schreiben uebernimmt.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
sub _write2file {
   my($self, %args) = @_;
   
   my $content = $args{CONTENT};
   my $fh      = $args{FH};
   
   print FH $content or return;
   
   return 1;
}


und dann in etwa so anwenden:

Code: (dl )
1
2
3
4
5
6
7
8
9
sub foo {
   # ...
   
   my $content = $self->header($msgid, $lines);
   
   $self->_write2file(CONTENT => $content,
                      FH      => $fh);
   # ...
}


kannst ja mal schreiben was du von der Idee haelst.


Komplett scheint mir das aber noch nicht, du willst doch noch die Ausgabe auf x Zeilen beschraenken lassen oder ? Sonst verstehe ich naemlich die Bedeutung von $lines nicht.

Code: (dl )
1
2
3
4
5
6
7
     unless($nohead)
    {
       $line =~ /^\.\s*$/ and last;
       $line =~ s/^\.\././;
       $fh ? (print $fh $line) : ($retval .= $line);
    }
    $nohead and $line =~ /^\s*$/ and $nohead = 0;

wuerde ich so schreiben
Code: (dl )
1
2
3
4
5
6
7
8
9
10
     if ($nohead) {
       last if $line =~ /^\.\s*$/;
       $line =~ s/^\.\././;
       $fh ? (print $fh $line)
           : ($retval .= $line);
    }
    else {
       $line =~ /^\s*$/;
       $nohead = 0;
    }


Ist finde ich auf den Blick einleuchtender. Der Rest aber gefaellt mir aber sehr gut.

Der Uebersichtlichkeit halber schreib ich noch den Konditionaloperator immer so.
Code: (dl )
1
2
3
4
 return 
        $fh ? 1
            : wantarray ? split(/\r?\n/, $retval)
                        : $retval;


Der Stil ist Geschmackssache und da sollte jeder seinen eigenen finden.

Grusz Christian.
,,Das perlt aber heute wieder...'' -- Dittsche
coax
 2004-02-27 22:59
#14358 #14358
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
achja und haeufig werden Default-Werte fuer uebergebene Parameter so gesetzt.
Code: (dl )
1
2
3
4
5
6
7
sub _toporretr {

 my(%defaultargs) = (MSGID => 1,
                     LINES => 0);

 my($self)= shift;
 my(%args) = (%defaultargs, @_);

vielleicht moechtest du das ja auch mit uebernehmen.
,,Das perlt aber heute wieder...'' -- Dittsche
esskar
 2004-02-27 23:19
#14359 #14359
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Code: (dl )
$self->print(POP3CMD_TOP." $msgidx $lines", $self->eol());


$lines gehört zum TOP Befehl!

zur write2file Funktion: hmmm, doof ist, wenn die mail 20 MB groß ist... mit der write2file methode würde ich dann zuerst alles in den speicher laden; so schreibe ich sie direkt in die datei, ohne Zwschichenpufferung.


danke für den rest!
coax
 2004-02-27 23:37
#14360 #14360
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
[quote=esskar,27.02.2004, 22:19]... hmmm, doof ist, wenn die mail 20 MB groß ist...[/quote]
stimmt daran hatte ich nicht gedacht.
,,Das perlt aber heute wieder...'' -- Dittsche
<< >> 7 Einträge, 1 Seite



View all threads created 2004-02-27 06:03.