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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ perl -E 'say for localtime'
9
33
11
25
9
116
2
298
1
$ perl -E 'say for localtime(scalar time)'
10
52
11
25
9
116
2
298
1
$ perl -E 'say for scalar localtime'
Tue Oct 25 11:33:14 2016
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):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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:
with join:
list context
1 2
with split:
scalar context
1
2
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!