Schrift
[thread]13106[/thread]

Filehandle, kommas und andere Merkwürdigkeiten

Leser: 1


<< |< 1 2 >| >> 19 Einträge, 2 Seiten
stelzbock
 2009-02-06 19:58
#118677 #118677
User since
2009-01-29
17 Artikel
BenutzerIn
[default_avatar]
Hey,

ich bin gerade fast verrückt geworden. Ich wollte filehande und STDOUT in ein Array einlesen und dann mit foreach und print sozusagen auf mehreren "Streams" das selbe ausgeben. Und es ging partout nicht.

Code (perl): (dl )
1
2
3
4
5
6
7
sub printDebug
{
        foreach(@outputs) 
        {
                print($_, @_, "\n");
        }
}


Dann hab ich nach stundenlangem probiere alle Klammern und Kommas weggelassen und irgendwann funktionierte es dann so:

Code (perl): (dl )
1
2
3
4
5
6
7
sub printDebug
{
        foreach(@outputs) 
        {
                print($_ @_, "\n");
        }
}


Man beachte das fehlende Komma nach $_ !
Für mich als alten C Hasen ist Perl mit seinem eher lockerem Syntax doch des Öfteren etwas schwer zu durchschauen.

Kann mir mal jemand erklären, was da im Interpreter passiert und warum ich da das Komma weglassen muss!?

Gruß Jan
moritz
 2009-02-06 20:13
#118679 #118679
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Schau mal in die Dokumentation zu print:

Code: (dl )
1
2
3
4
5
6
       print FILEHANDLE LIST
print LIST
print Prints a string or a list of strings. Returns true if
successful. FILEHANDLE may be a scalar variable name, in which
case the variable contains the name of or a reference to the
filehandle, thus introducing one level of indirection.


Was da steht ist: wenn hinter dem 'print' ein Ausdruck, dann ein Leerzeichen und dann noch ein Ausdruck steht, dann wird der erste als Filehandle interpretiert. Wenn du ein Komma setzt ist es einfach Teil der 'LIST'e.
LanX-
 2009-02-06 23:36
#118681 #118681
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
stelzbock+2009-02-06 18:58:34--
Für mich als alten C Hasen ist Perl mit seinem eher lockerem Syntax doch des Öfteren etwas schwer zu durchschauen.

Kann mir mal jemand erklären, was da im Interpreter passiert und warum ich da das Komma weglassen muss!?


das mit dem Filehandles wird AFAIK intern wie bei Objekten geparst, sprich das ist die indirekte Objektsyntax, wie wenn man
Code (perl): (dl )
new OBJ

ruft man hier die Methode print des Objektes Filehandle auf.

Ich bin beileibe kein C-Haserl, aber ich dachte gerade das wäre C-Syntax ?!?
murphy
 2009-02-07 03:02
#118682 #118682
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
LanX-+2009-02-06 22:36:35--
[...] Ich bin beileibe kein C-Haserl, aber ich dachte gerade das wäre C-Syntax ?!?


In C muss man grundsaetzlich um jede Parameterliste Klammern setzen und alle Parameter mit Kommata trennen. Eine irgendwie geartete Objektsyntax existiert in C ueberhaupt nicht, hoechstens in C++ -- aber das ist entgegen der landlaeufigen Meinung eine andere und auch syntaktisch inkompatible Programmiersprache.
When C++ is your hammer, every problem looks like your thumb.
GwenDragon
 2009-02-07 10:10
#118683 #118683
User since
2005-01-17
14745 Artikel
Admin1
[Homepage]
user image
Wenn eineR früher viel C programmiert hat, stolpert eineR über so manches bei Perl.
Deswegen gibt es auch die perltraps für Fremdsprachler in der Doku. ;)
LanX-
 2009-02-07 14:56
#118684 #118684
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Hab etwas C++ Code gegogelt und zumindest beim Konstruktor sowas ähnliches wie
Code (perl): (dl )
obj=new Class
gefunden, gibts AFAIR so auch in Java. definitiv Javascript.

Mit geklammerten Parametern hats wenig zu tun.

Ich meine gelesen zu haben dass dies die Quelle dieses dämlichen Methodenaufrufsyntaxes in Perl ist.

M.E. wärs besser gewesen konsequent auch den Konstruktoraufruf nur mit -> zu erlauben, aber zu spät.


Das hätte mit sich geführt dass man bei Filehandles nicht
Code (perl): (dl )
print $fh "text"
schriebe sondern
Code (perl): (dl )
 $fh->print "text"
stelzbock
 2009-02-07 15:11
#118685 #118685
User since
2009-01-29
17 Artikel
BenutzerIn
[default_avatar]
Mir gefällt C gerade weil es sehr strikt mit dem Syntax umgeht. In Perl gibt es sehr viele Syntaxvarianten, die oberflächlich betrachtet das gleiche tun aber in Sonderfällen eben auch nicht wie z.B. "..." und '...'. Die einem machnmal das Genick brechen können. Für das, wofür Perl gemacht wurde, ist es aber unschlagbar und auch sehr Straight-Forward zu programmieren.

@LanX: deine Erklärung geht schon in die Richtung nach dem was ich wissen wollte. Aber wo gibt es denn was zum Thema "indirekter Objekt Syntax"?

Ist allgemein Nutzbar auch in eigenen Subs oder ist das eine "hardgecodete" Ausnahme für print?

Also was kann ich mit
Code (perl): (dl )
mysub("lalala" "dumdidum",17);


oder
Code (perl): (dl )
mysub($ref "dumdidum",17);


Würde ersteres funktionieren? Hängt das von der Implementierung der Sub ab? Würde dann nach LanX Logik der Interpreter versuchen, die MEthode mysub von $ref zu starten?

Könnte mal jemand ein mimalistisches Skript posten, welches diesen Syntax verwendet?

Danke!
GwenDragon
 2009-02-07 15:14
#118686 #118686
User since
2005-01-17
14745 Artikel
Admin1
[Homepage]
user image
Hmm.
Wäre besser &#8230; und noch mehr. Alles eine Frage der Gewöhnung.
Perl 6 wird etwas genauer und nachvollziehbarer in der Sytax sein.
stelzbock
 2009-02-07 15:17
#118687 #118687
User since
2009-01-29
17 Artikel
BenutzerIn
[default_avatar]
LanX-+2009-02-07 13:56:08--

Das hätte mit sich geführt dass man bei Filehandles nicht
Code (perl): (dl )
print $fh "text"
schriebe sondern
Code (perl): (dl )
 $fh->print "text"


Ja! Das wäre klar und eindeutig! Ich finde übrigens auch das mit den globals irgenwie merkwürdig.

Trotz use strict kann man einfach open(MEINLUSTIGESFILEHANDLE, "lala.txt") aufrufen ohne es voher deklariert zu haben.
Am Anfang dachte ich, es geht nur FILE weil in allen Beispielen meist FILE benutzt wird... Und dann kann man auch mit my $file_ref eine Referenz benutzten anstatt nem golbal.... als alles recht verwirrend, find ich!
GwenDragon
 2009-02-07 15:51
#118688 #118688
User since
2005-01-17
14745 Artikel
Admin1
[Homepage]
user image
Ja, FILEHANDLES sind global.
Zu den besseren Perl Praktiken gehört eds sowieso, ein lexikalisches Filehandle zu verwenden.

Perl lässt noch viel mehr Konstrukte zu die Perl-Anfänger und andere verwirren.
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



View all threads created 2009-02-06 19:58.