Autor Thema: Artikel Nummerieren / Variablen mit my deklarieren  (Gelesen 8153 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline Benny

  • Newbie
  • *
  • Beiträge: 2
  • Lob: 0
Artikel Nummerieren / Variablen mit my deklarieren
« am: September 25, 2007, 09:14:54 »
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

Linkback: https://www.shoppilot.net/pf/index.php?topic=952.0

Offline cru

  • Jr. Member
  • **
  • Beiträge: 69
  • Lob: 7
Re: Artikel Nummerieren / Variablen mit my deklarieren
« Antwort #1 am: September 25, 2007, 10:31:33 »
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.

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



« Letzte Änderung: September 25, 2007, 10:33:48 von cru »

Offline Benny

  • Newbie
  • *
  • Beiträge: 2
  • Lob: 0
Re: Artikel Nummerieren / Variablen mit my deklarieren
« Antwort #2 am: September 25, 2007, 11:39:08 »
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

Offline dobra

  • Global Moderator
  • Hero Member
  • *****
  • Beiträge: 1353
  • Lob: 18
Frage zu use strict;
« Antwort #3 am: November 03, 2007, 17:13:50 »
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:
Zitat
This 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?
« Letzte Änderung: November 03, 2007, 17:28:42 von dobra »
mfG
dobra

Offline admin

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 545
  • Lob: 10
Re: Artikel Nummerieren / Variablen mit my deklarieren
« Antwort #4 am: November 04, 2007, 12:24:53 »
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


Offline dobra

  • Global Moderator
  • Hero Member
  • *****
  • Beiträge: 1353
  • Lob: 18
Re: Artikel Nummerieren / Variablen mit my deklarieren
« Antwort #5 am: November 04, 2007, 12:33:25 »
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ß...)
« Letzte Änderung: November 05, 2007, 08:21:55 von dobra »


xx
Variablen im Header übermitteln

Begonnen von MichaelSchmitt

2 Antworten
8926 Aufrufe
Letzter Beitrag August 02, 2007, 22:59:42
von MichaelSchmitt
xx
Summe der aus DB eingelesenen Variablen berechnen

Begonnen von dobra

6 Antworten
8364 Aufrufe
Letzter Beitrag Januar 15, 2007, 20:25:07
von dobra
xx
GS nur für bestimmte Artikel

Begonnen von dobra

0 Antworten
4563 Aufrufe
Letzter Beitrag Oktober 19, 2009, 15:30:07
von dobra
xx
EP: Artikel n-mal in WK -> Crossartikel n-mal in WK

Begonnen von ahe

0 Antworten
7702 Aufrufe
Letzter Beitrag September 18, 2003, 12:27:23
von ahe