Thread Perlverhalten bei undef im Schleifenkopf 5.18 und 5.20
(13 answers)
Opened by bianca at 2016-10-23 07:14
Ich denke, dass pq es so rum meinte scalar readline $fh
Schauen wir uns analog dazu ein anderes Beispiel an: Mit say localtime wird localtime() im Listenkontext aufgerufen und es liefert eine Liste einzelner Werte. Das gleiche passiert, wenn man say localtime(scalar time) aufruft. Das scalar ändert nichts am Kontext des localtime (nur am Kontext des time() ). Wenn man aber den Datumsstring haben will, den localtime() im skalaren Kontext liefert, schreibt man say scalar localtime. Damit steht localtime() nun im skalaren Kontext und liefert den String. Zur besseren Darstellung habe ich hier auf say for localtime gewechselt, damit die Listenelemente besser dargestellt werden. for localtime setzt das localtime ebenfalls in Listenkontext. Code: (dl
)
1 $ perl -E 'say for localtime' Zurück zum readline: Das readline(scalar $fh) "zwingt" den Filehandle $fh in einen Skalaren Kontext. Der Filehandle ist aber bereits ein Skalar, also hat das keine weitere Auswirkung. Dann wird das Ergebnis an readline() übergeben. Über den Kontext des readline() sagt das gar nichts aus. Glückliche Fügung ist derzeit, dass split( PATTERN, EXPRESSION, LIMIT ) EXPRESSION anscheinend in einen skalaren Kontext setzt, womit das readline() eben auch im skalaren Kontext steht. Kleines Beispiel mit split und join (welches eine Liste von Argumenten erwartet und verarbeitet): Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #! /usr/bin/perl use strict; use warnings; use 5.010; sub foo { if ( wantarray ) { warn "list context\n"; return ( 1,2 ); } else { warn "scalar context\n"; return "1,2"; } } say "with join:"; say join " ", foo(); say "with split:"; say for split m/,/, foo(); Ergibt: edits: 1. Code-Beispiel für localtime() erweitert; 2. Code-Beispiel angepasst Last edited: 2016-10-25 11:55:34 +0200 (CEST) meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen! |