Artikel Nummerieren / Variablen mit my deklarieren

Begonnen von Benny, September 25, 2007, 09:14:54

« vorheriges - nächstes »

0 Mitglieder und 1 Gast betrachten dieses Thema.

Benny

Hi,

wenn jemand etwas im Shop bestellt, sollen in der Bestellmail die Artikel nummeriert werden.
1. Produkt1 101.99€
2. Produkt2 1354.49€
...

Dazu habe ich folgendes Script geschrieben, welches ich per loopitem __test:nummerieren__ ausgebe. Funktioniert auch soweit:

<!--spmacro:module(test)
sub nummerieren{
if($nummer > 0) { $test ++; }
else{ $nummer = 1; }
main::mprint($nummer);   
}
-->

Jetzt meine Frage, da ich mich in perl nicht wirklich auskenne:
In Beispielscripts sind die Variablen immer mit my deklariert, dadurch sind sie aber nur in dem Anweisungsblock nutzbar, oder?
Kann das irgendwelche Einflüsse auf die Funktionalität des Shops haben, wenn ich die nicht mit my deklariere?

Vielen Dank schonmal,
Benjamin

cru

Hallo Benny,

bevor ich auf die Frage eingehe, eine kleine Anmerkung zu Ihrem Script.

Einfacher und eleganter lässt es sich lösen indem Sie den Artikelindex benutzen, welcher dem Script in jedem Fall als erster Parameter übergeben wird.
Eine einfache Funktion um die Artikel zu nummerieren könnte also folgendermaßen aussehen:


<!--spmacro:module(test)
      sub nummerieren {
            my $index = shift; # Hier der angesprochene erste Parameter(Artikelindex)
            $index ++;         # Da der Artikelindex bei 0 startet muss er noch um 1 erhöht werden.
            main::mprint($index);
      }
-->


Die Funktion __test::nummerieren__ wird weiter per loopitem ausgegeben.


Nun zu Ihrer Frage, warum Variablen mit dem Wort "my" deklariert werden:


Fehler finden
Der erste Vorteil den die Deklaration per "my" mit sich bringt ist, dass Tippfehler im Script schneller erkannt werden können.
Dies ist jedoch nur der Fall, wenn zudem auch noch die Anweisung "use strict" am Anfang des Scripts verwendet wird.

Würde man ohne "my" und ohne "use strict" folgenden Code schreiben,


$zahl = 3;
$zahl = $zahl * $zahl;

print $zal;



würde die Ausgabe " " lauten, da ein Tippfehler vorliegt und die Variavle $zal keinen Wert hat.

Schreibt man jedoch folgenden Code,


use strict;

my $zahl = 3;
$zahl = $zahl * $zahl;

print $zal;


erhält man diese Fehlermeldung,

Global symbol "$zal" requires explicit package name


welche darauf hinweist, dass die Variable $zal noch nicht richtig deklariert wurde.

Gültigkeit der Variablen
Die Deklaration mit "my" verhindert außerdem, dass globale Variablen durch Wiederverwendung des Variablennamens ohne es zu wollen überschrieben werden.

Hierzu auch ein kleines Beispiel:
Ohne "use strict" und "my",


$zahl = 3;

if ($zahl == 3){
    $zahl = 5;
    print $zahl. "\n";
}
print $zahl;


würde die Ausgabe
5
5

lauten, da die globale Variable $zahl, welche ganz zu Anfang deklariert wurde in der in der Anweisung des if-Blocks überschrieben wird.

Verwendet man jedoch "use strict" und "my",


use strict;

my $zahl = 3;

if ($zahl == 3){
    my $zahl = 5;
    print $zahl. "\n";
}
print $zahl;


lautet die Ausgabe,
5
3

da die Variable durch die deklaration mit "my" mehrfach im Speicher vorhanden sein kann.
Es kann also nicht passieren, dass man ausversehen globale Variablen überschreibt, welche im späteren Programmablauf noch benötigt werden.

Zitat von: Benny am September 25, 2007, 09:14:54
Kann das irgendwelche Einflüsse auf die Funktionalität des Shops haben, wenn ich die nicht mit my deklariere?

Nein, es kann keine Auswirkungen auf den Shop haben, da Sie Variablen welche in den Shop-Scripten verwendet werden über den Modulnamen ansprechen müssten, um diese zu verändern.

Dennoch würde ich Ihnen aus oben genannten Gründen empfehlen "use strict" und "my" in Ihren Scripten zu verwenden.


mfg
cru




Benny

Danke für die schnelle Antwort,

ich habe es jetzt so, wie Sie es empfohlen haben, gemacht:
<!--spmacro:module(test)
      sub nummerieren {
            my $index = shift; # Hier der angesprochene erste Parameter(Artikelindex)
            $index ++;         # Da der Artikelindex bei 0 startet muss er noch um 1 erhöht werden.
            main::mprint($index);
      }
-->


Funktioniert super, danke!  :)

mfg
benny

dobra

#3
Hallo,

Bin auf der Suche nach neuen Ideen über diesen Beitrag gestolpert ...

Kann mir bitte jemand erklären, wo (wie) ich das use strict; in meine Scripte einbauen soll?

Beispiel:
mein Script schaut so aus (und liefert das gewünschte Ergebnis)
<!--spmacro:module(advent)

($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
$mon += 1; $year += 1900; # Y2K
my $datum  = sprintf("%02d%02d",$mon,$mday);

sub embed {

my $count = ssp::readSQLData("SELECT ITEMID FROM PY2_ITEM WHERE DATUM='$datum'","ITEMID");
if ($count >= 0) {
my $i=0;
while ($count > $i) {
$artikel = ssp::get_var_db("ITEMID",$i);
ssp::embedded("csearch","advent.txt",$artikel);
++$i;
return "noinc";
}
}
}
....
usw
....
-->


Wenn ich use strict; gleich nach dem  <!--spmacro:module(advent) einfüge, kommt statt dem gewünschten Ergebnis seitenweise Fehleranzeigen.
Schreibe ich es nach dem sub embed { kommt auch noch das:
ZitatThis Error has occured:
parsing error 123-6 in GLOB(0x82e33f8): Global symbol "$artikel" requires explicit package name at (eval 59) line 16, <> line 345. Global symbol "$artikel" requires explicit package name at (eval 59) line 17, <> line 345.

Wieso wird überhaupt ein Fehler gemeldet, wenn das Script ohne use strict; doch genau das macht, was es soll und die Seite exakt richtig angezeigt wird?

cru meint, man sollte es verwenden
habe ich bis jetzt nie gemacht aber dennoch - wenn ein Fehler im Script war - eine entsprechende Meldung bekommen.
Hab ich da etwas falsch verstanden?
mfG
dobra

admin

Hallo Dobra,

hier ist es sehr gut erklärt:
http://faq.perl-community.de/bin/view/Wissensbasis/UseStrict

Die Fehlermeldung wäre weg, wenn dort my $ar... = ssp::get_var_db("ITE.....
stehen würde  ;)

Gruß
hop


dobra

#5
Hallo hop,

vielen Dank für den Link - ist wirklich gut erklärt (daß sogar ich es begreife  ;))

die "seitenweise Fehleranzeigen" sind auch weg - hat nur ein "my $out;" im oberen, globalen Bereich gefehlt.
(kleine Ursache - große Wirkung  :D - wenn man's weiß...)
mfG
dobra