Beitrag von Ruben (403 Beiträge) am Freitag, 12.Oktober.2001, 10:20.
@"Perler" - Sub2 in Sub1 aufrufen - Fehler wenn Sub2 nach Sub1 steht??????
Hallo,
wenn ich in einer Sub2, die "nur" die html-Ausgabe macht, eine weitere Sub1 aufrufe (ebenfalls "nur" html-Ausgabe) geht das nur, wenn die Sub1 im Script vor Sub2 steht, ansonsten kommt Fehlermeldung "sub1 nicht deklariert"
Ist das ok so? Sollte Perl nicht eigentlich das gesamte Script durchsuchen, ob da "irgendwo" noch was steht?
Danke für Infos dazu
Ruben
Antworten
Beitrag von Sander (8133 Beiträge) am Freitag, 12.Oktober.2001, 14:42.
Re: @"Perler" - Sub2 in Sub1 aufrufen - Fehler wenn Sub2 nach Sub1 steht??????
Du kannst die subs gleich zu anfang deklarieren - dann sollte sie überall gefunden werden.
sub erste; sub zweite; # unterroutinen vordefinieren, damit sie im programm wie befehle benutzen werden können
erste Param1,param2,param..;
sub zweite
{
my ($var,$var2,..)=@_;
...
}
sub erste
{
my ($var,$var2,..)=@_;
#aufruf der zweiten
zweite param1,param2...;
}
Sander
Antworten
Beitrag von Ruben (403 Beiträge) am Freitag, 12.Oktober.2001, 15:35.
Re: @"Perler" - Sub2 in Sub1 aufrufen - Fehler wenn Sub2 nach Sub1 steht??????
Hallo, Sander
Schön, dich zu sehen. :-)
Mhm, klingt eigentlich ganz logisch, ist ja in anderen Sprachen auch so *michandenkopfschlag*.
Danke für den Tip, ich check das dann mal.
CU
Ruben
Antworten
Beitrag von Ruben (403 Beiträge) am Sonntag, 14.Oktober.2001, 16:27.
Re: @"Perler" - Sub2 in Sub1 aufrufen - Fehler wenn Sub2 nach Sub1 steht??????
Volltreffer, danke Sander.
Hatte zwar zunächst das Prob, daß ich einige Perl-Templates include und bei der Sub-Definition im Hauptscript logischerweise ne Fehlermeldung bekam.
Aber klaro, erste Zeile nach <perl> subs definieren und das script ist "perfekt".
CU
Ruben
Antworten
Beitrag von Sander (8133 Beiträge) am Sonntag, 14.Oktober.2001, 21:59.
Re: @"Perler" - Sub2 in Sub1 aufrufen - Fehler wenn Sub2 nach Sub1 steht??????
ich dachte zwar auch, das ist ein Vorteil von perl das die subs stehen können wo ich will, aber naja - manchmal wohl nicht ;-)
Sander
Antworten
Beitrag von Christoph Bergmann (8110 Beiträge) am Montag, 15.Oktober.2001, 14:05.
Re: @"Perler" - Sub2 in Sub1 aufrufen - Fehler wenn Sub2 nach Sub1 steht??????
Kommt drauf an wie Du sie benutzt:
meinesub $param;
oder
im ersten Fall muss die Sub VOR dem Aufruf definiert sein, im zweiten Fall (mit dem & davor) ist es egal. Das ist deshalb so, weil "meinesub" ja alles mögliche sein könnte: Ein einfacher Text, ein Perl-Befehl, ein sub-Aufruf, ein Fehler ;-)
Antworten
Beitrag von Ruben (403 Beiträge) am Montag, 15.Oktober.2001, 17:34.
Re: @"Perler" - nochmal Problem
War Quatsch mit dem Definieren am Anfang, meinte deklarieren (Fremdwörter sind manchmal eben doch Glückssache).
Wenn die subs am Afang deklariert werden, können sie dann definiert werden wo man will.
Ich rufe sie eigentlich immer mit &subroutine(paras)auf.(Die Parameter sind aber oft auch nicht notwendig, irgendwoher kennt die sub alle im Hauptscript stehenden var-inhalte und kann damit arbeiten. (puhhh - passiert aber auch manchmal zeugs damit, was man gar nicht will)
Klar ist mir nur noch nicht so richtig die Sache mit den Rückgabewerten.
Wenn in der sub steht:
sub test
{
out "das ist ein Test";
}
gibt er es richtig aus, auch an der Stelle wo die Sub aufgerufen wird.
Wenn drin steht:
sub test
{
$test = "das ist ein Test";
}
belegt er die var test wie erwartet, allerdings halt "global" fürs ganze script
Wenn drin steht
sub test
{
my $test = "das ist ein Test";
}
passiert nix, wie erwartet
bei
sub test
{
my $test = "das ist ein Test";
return ($test)
}
wird aber test auch nicht zurückgegeben (?)
hingegen bei
sub test
{
my $test = "das ist ein Test";
$testa = $test;
return ($testa)
}
gibt er testa zurück - nur ist halt dann das testa ab dem Zeitpunkt im Hauptscript mit dem Wert aus der Sub belegt bis der Inhalt der var testa irgendwo wieder manipuliert wird, das gleiche passiert aber auch ohne return
Wie jetzt nun richtig einwtzen?
Axo - ist nach dem return ein ";" notwendig? (geht offensichtlich auch ohne)
Und dann steht da noch das Prob mit dem Aufruf ner Sub in einem EOF-Block - habs nicht hingekriegt mit dem Vorschlag von Christoph.
Ich wollte in nem EOF-Block einen variablen String, den ne sub generiert, mit ausgeben (Block ohne Unterbrechung), ungefähr so:
out<<EOF;
<table>
<tr><td colspan=3>Hier steht was drin</td></tr>
${&trennzeile(cs, h, f)}#cs,h,f mit Werten belegt bzw. vars
<tr><td colspan=3>Hier steht was andres drin</td></tr>
</table>
EOF
und hier die sub:
sub trennzeile
{my $colspan=$_[0];my $hoehe=$_[1];my $farbe=$_[2];
my $tz = <tr><td colspan=$colspan bgcolor=$farbe><img src=$pix heigth=$heohe></td></tr>;
return ($tz)
}
kriegs einfach nicht hin. Ist ja auch zusätzlich ein Prob, daß trennzeile() im aufrufenden Teil ständig andere Werte übergibt, je nach Layout, und die var $tz irgendwie in ihrer Gültigkeit nur "einmalig" sein sollte.
Danke für Hilfe im Voraus
Ruben
Antworten
Beitrag von Sander (8133 Beiträge) am Montag, 15.Oktober.2001, 18:05.
Re: @"Perler" - nochmal Problem
>>
sub test
{
my $test = "das ist ein Test";
return ($test)
}
wird aber test auch nicht zurückgegeben (?)
>>
Wenn du diese sub mit
$testa=&test; aufrufst, hast du den zurückgegebenen Wert in $test drin.
oder mit
out &test;
wird der Inhalt von $test am zeitpunkt des returns ausgegeben.
Das hat den Vorteil, das du auch 2 Austiegsbedingungen basteln kannst:
if (&test("Berlin")) #prüfen ob Berlin enthalten ist
{
out "alles palletti";
}else
{
out "leider nein";
}
sub test
{
my $holen=$_[0];
get "Stadt==$holen";
if ($amount)
{
return 1;
}else
{
return 0;
}
}
Hoffentlich wars das, was du nicht verstanden hast.
Sander
Antworten
Beitrag von Ruben (403 Beiträge) am Montag, 15.Oktober.2001, 18:31.
Re: @"Perler" - nochmal Problem
Danke, wieder etwas gelernt :-), bringt mich erst mal weiter (und gleich mehr als ich dachte).
Mit der Sache im EOF-Block haste auch keine Idee?
CU
Ruben
Antworten
Beitrag von Sander (8133 Beiträge) am Montag, 15.Oktober.2001, 19:02.
Re: @"Perler" - nochmal Problem
Antworten
Beitrag von Ruben (403 Beiträge) am Montag, 15.Oktober.2001, 20:30.
Re: @"Perler" - nochmal Problem
Mhm, machter aber auch nich so, is einfach nicht da in der Ausgabe, so als wäre nichts passiert. Wenn ich mir die debug-Var anzeigen lasse (in der sub einfach mal belegt mit $dbg.="SUB tz aufgerufen" und am ende vom Hauptscript mit out $dbg anzeigen lasse) kommt die Ausgabe sovielemal, wie die sub aufgerufen wird, aber es gibt weder ne Fehlermeldung noch wird im html-code diese Tabellenzeile eingefügt - es läuft einfach ins leere ;-(
Na mal sehn, vielleicht ist das ja ein Prob für Christoph was ihn "reizt" :-))
Antworten
Beitrag von Sander (8133 Beiträge) am Montag, 15.Oktober.2001, 20:41.
Re: @"Perler" - nochmal Problem
jo, das meine ich ja damit. Du bastelst dir ne Variable mit dem Namen (nicht wert) $<tr><td colspan=... bgcolor=...><img src=... heigth=...></td></tr> - Diese gibts aber gar nicht also ist sie leer.
Warum unterbrichst du nicht einfach EOF? ;-)
Sander
Antworten
Beitrag von Ruben (403 Beiträge) am Montag, 15.Oktober.2001, 21:22.
Re: @"Perler" - nochmal Problem
jepp, ist wohl die einfachste Variante. Hab halt immer im Editor dann keinen richtigen Durchblick mehr, weil die End-EOF's ja immer am Anfang der Zeile stehen. Und bei verschachtelten Tabs wird da schnell alles unübersichtlich, is aber besser als jeztz hier stundenlang zu basteln wegen so nem mehr "kosmetischen" Problem.
Noch was, gibts ne Systemvariable fürs aktuelle Verzeichnis, in dem das jeweilige Template steht? (halt sowas wie $_htx oder $_link - ich brauchs aber ohne den Template-Namen, den will ich erst anhängen (zur Verwendung in h-refs, damit von einem Template ein anderes einfach verlinkt werden kann und nicht der absolute Pfad eingetragen werden muß - da fällt dann die Anpassung auf anderen Accounts komplett bei den Links weg.
Danke
Ruben
Antworten
Beitrag von Sander (8133 Beiträge) am Montag, 15.Oktober.2001, 22:20.
Re: @"Perler" - nochmal Problem
Antworten
Beitrag von Christoph Bergmann (8110 Beiträge) am Montag, 15.Oktober.2001, 23:23.
Re: @"Perler" - nochmal Problem
Antworten
Beitrag von Ruben (403 Beiträge) am Dienstag, 16.Oktober.2001, 09:33.
Re: @"Perler" ... Teplatedir im Link - noch etwas anders
Hallo,
stimmte nicht ganz, mit dem substr-construkt, brauch ja den pfad in dem das template liegt ohne den templatename.
Habs so hingekriegt:
$dir=substr($htx,1,rindex($htx, "/"));
und dann <a href=="http://www.baseportal.de/cgi-bin/baseportal.pl?htx=$dir/anderestemplate>Anderes anzeigen</a>
Danke trotzdem, war der richtige Ansatz zum umsetzen.
Antworten
Beitrag von Ruben (403 Beiträge) am Dienstag, 16.Oktober.2001, 09:36.
Re: @"Perler"...sorry, falsches reinkopiert
Antworten
Beitrag von Christoph Bergmann (8110 Beiträge) am Montag, 15.Oktober.2001, 23:34.
Re: @"Perler" - nochmal Problem - aufruf sub in <<...
Antworten
Beitrag von Ruben (403 Beiträge) am Dienstag, 16.Oktober.2001, 07:03.
Re: @"Perler" - nochmal Problem - aufruf sub in <<...
Schön, ich hatte den jetzt von dir vorgeschlagenen Konstrukt gestern abend auch im Perl-Kochbuch gefunden (Rezept 1.10 Interpolation....). So richtig verstehen tu ichs nich, aber mal sehn, obs tut.
Danke
Antworten
Beitrag von Ruben (403 Beiträge) am Dienstag, 16.Oktober.2001, 07:19.
Re: @"Perler" - nochmal Problem - aufruf sub in <<...
sorry, hatte glatt übersehn, daß ihr ja auch ne Lösung für ne Varbelegung fürs htx-dir gepostet habt. Danke an Sander und Christoph, ich check das jetzt alles mal durch.
Macht richtig Spaß, hier zu basteln - für jede "Korkenzieheridee" wird glatt n Lösungsansatz oder gleich ne ganze Lösung geschickt - das fetzt :-))
Antworten