Toon posts:

[perl] meer dan 3 keer nesten?

Pagina: 1
Acties:

Verwijderd

Topicstarter
ik ben bezig met een perl script/programa om via de dos prompt te kunnen mailen.

maar omdat de dos prompt qua parameters erg beperkt is en ik het programma zo flexibel en schaalbaar mogelijk wil houden
zorg ik voor een aantal manieren van invoer.

de basis is eigenlijk dit

mailtoo -voor e@mail.nl

ook mogelijk is -voor e@mail.nl,blaat@blaat.nl

maar ook vanuit een bestand e-mail adressen inlezen.
en dit combineren met e-mail adressen

mailtoo -voor admin@blaat.nl,email_bestand.txt

(waarin email_bestand.txt b.v. zo iets kan bevatten;
blaat@blaat.nl,blaat@snel.nl,bob@jaap.be
jaap@bob.nl,snel@blaat.nl
)

dit werkt allemaal prima, en ik ben ook heel trots op mezelf :P
(ben nog niet zo lang bezig met perl namelijk en het lukt me toch aardig)

maar de code om dit te doen is nu een aantal keer genest.
ik heb nu al in dit stukje zo veel mogelijk $_'s veranderd in gewone variablen.
maar ik vroeg me toch of of het niet beter zou zijn om er meschien maar ergenst een functie van te maken.
want ik kan me ergenst herineren dat meer dan 3 keer nesten gewoon niet overzichtelijk is en dat je het zo veel mogelijk moet vermijden.

dus ik wou even commentaar hebben over de duidelijkheid van de code en of ik het meschien niet in functies moet stoppen.

code:
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
    if (@ARGV[$argnum]=~/-voor/) {
        $argnum++;
        @temp = split(/,/,@ARGV[$argnum]);
        foreach $par (0 .. $#temp) {
            if (@temp[$par]!~/.*\@.*\.(be|nl|BE|NL)/ && (! -e @temp[$par])) {
                $error_num++;
                @error[$error_num-1]="e-mail notatie van @temp[$par] niet correct.";
            }
            if (@temp[$par]=~/.*\@.*\.(be|nl|BE|NL)/ && (! -e @temp[$par])) {
                $voor = "@temp[$par],$voor";
                $voor_num++;
            }
            if (@temp[$par]!~/.*\@.*\.(be|nl|BE|NL)/ && (-e @temp[$par])) { 
                open (INFILE, @temp[$par]);
                while (<INFILE>) {
                    @temp2 = split(/,/,$_);
                    foreach $par_line (0 .. $#temp2) {
                        if ($temp2[$par_line]=~/.*\@.*\.(be|nl|BE|NL)/) {
                            chomp($temp2[$par_line]);
                            $voor = "$temp2[$par_line],$voor";
                            $voor_num++;
                        }
                        else {
                            $error_num++;
                            @error[$error_num-1]="e-mail notatie van $temp2[$par_line] in @temp[par] niet correct.";
                        }
                    }
                }           
            }
        }   
    }


alle commentaar is welkom over de constructie ervan.

als sidenote, (voor de mensen die dat intresant vinden)
programma is bedoelt voor het bedrijf waar ik stage loop,
en zodra ik weg ben is daar dus niemand meer met perl kennis,
dus ik wou alles zo simpel mogelijk houden.

p.s.
dit is dus maar een klein stukje van de code.

[ Voor 4% gewijzigd door Verwijderd op 14-01-2003 11:17 ]


Verwijderd

Waarom heb je geen array gebruikt voor de adressen, zo'n teller vind ik echt niet handig. En ik vind het raar dat je alleen email verzend naar nederland of belgië.

[ Voor 9% gewijzigd door Verwijderd op 14-01-2003 11:38 ]


Verwijderd

Topicstarter
die teller is human interface :)
waarom zou ik een array gebruiken?
de module die ik hier voor gebruik mail::sender
wil het als string variabel zien met adressen gescheiden door comma's.
als ik dan eerst alles in een array moet zetten moet ik latter weer alles terug draaien.

Verwijderd

Wat me wel opvalt is dat je elementen uit arrays soms zo aanspreekt @array[$element] en soms zo $array[$element], die laatste methode is de juiste.

En "foreach $par (0 .. $#temp)" had ook "for(my $par = 0; $par < @temp; $par++)" kunnen zijn...

En als het voor de rest werkt, zou ik het zo laten, alleen de syntax kan dus om sommige plaatsen verbeterd worden, en misschien een aparte sub om een e-mailadres op geldigheid te testen. In perl gaat het er gewoon om dat het werkt, de schoonheidsprijs verdient het nooit...

Verwijderd

Verwijderd schreef op 14 januari 2003 @ 14:07:
Wat me wel opvalt is dat je elementen uit arrays soms zo aanspreekt @array[$element] en soms zo $array[$element], die laatste methode is de juiste.

En "foreach $par (0 .. $#temp)" had ook "for(my $par = 0; $par < @temp; $par++)" kunnen zijn...

En als het voor de rest werkt, zou ik het zo laten, alleen de syntax kan dus om sommige plaatsen verbeterd worden, en misschien een aparte sub om een e-mailadres op geldigheid te testen. In perl gaat het er gewoon om dat het werkt, de schoonheidsprijs verdient het nooit...
Daar ben ik het niet mee eens, je kunt ook perl goed organiseren. Je manier van progammeren kan de code toch een stuk duidelijker maken. In de code van de poster bijvoorbeeld staat amper commentaar en het uitlijnen ziet er ook niet echt super uit, maar dat is puur smaak. Maar ook in perl kun in net zoals in elke taal structuur aanbrengen, wat de gehele code veel leesbaarder maakt.

Verwijderd

Daar ben ik het niet mee eens, je kunt ook perl goed organiseren. Je manier van progammeren kan de code toch een stuk duidelijker maken. In de code van de poster bijvoorbeeld staat amper commentaar en het uitlijnen ziet er ook niet echt super uit, maar dat is puur smaak. Maar ook in perl kun in net zoals in elke taal structuur aanbrengen, wat de gehele code veel leesbaarder maakt.
Natuurlijk heb je gelijk, ik plak boven elke functie die in perl ik maak ook dikke remark met de beschrijving van de functie en wat de in- en output is, en als ik hashes en arrays aanmaak gebruik ik ook telkens een nieuwe regel, maar moet je dat een ander dan ook opleggen?

Er werd duidelijk gezegd dat ie een beginner is, en hey, het werkt...

Verwijderd

Topicstarter
commentaar moet er idd nog bij, maar ik zat nog te denken hoe ik het structureel beter zou kunnen maken.


heb nu ook dit weer bedacht. (plus dat e-mail checken een functie maken)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ARGV[foo] to array
for array do{
    if (file?) {
        open file
        for (each line in file) {
            line to array
            for (each item in array) {
                &check-mail
            }
        }
    }
    else {
        &check-mail
    }
}


maar dan gaat hij toch nog behoorlijk diep, is er meschien een manier hoe ik sommige dingen samen kan voegen?
Pagina: 1