linux-l: perl return

Jens Dreger jens.dreger at physik.fu-berlin.de
Di Feb 20 16:10:10 CET 2001


On Tue, Feb 20, 2001 at 01:42:27PM +0100, Alexander Lehmann wrote:
> * Oliver Hillmann (oh at novaville.de) [010220 13:30]:
> > On Mon, 19 Feb 2001, Alexander Lehmann wrote:
> > 
> > > es geht mir nicht um die ausgabe, sondern darum, wie ich den
> > > Quelltext verkuerzen kann ( am liebsten waere mir das programm
> > > ohne if abfrage). Ich will ueberpruefen ob 
> > > "grep(/^(.+?\:){3}0019 01.+?/,<COM>)" definiert ist, aber in den
> > 
> > open(COM, "</proc/net/tcp") or die("$!");
> > print grep(/^(.+?\:){3}0019 01?/,<COM>)."\n";
> > close(COM);
> 
> das Problem bei dem ding ist aber, das ich als Ausgabe nicht 0 
> oder 1 erhalte, sondern den kompetten zutreffenden String.

Jetzt habe ich doch vergessen, meine mail gestern abzuschicken. Da
hatte ich

      print grep(/^(.+?\:){3}0019 01?/,<COM>)+0;

vorgeschlagen, was auch scheinbar geht. Erst, wenn zwei matches oder
mehr vorhanden sind, bekommt man nicht "1", sondern eben "2" oder so
als Ausgabe.

Der Grund fuer dieses "seltsame" Verhalten liegt darin, dass sich
perl-Funktionen mitunter unterschiedlich verhalten, je nachdem, in
welchem Kontext sie stehen. Bei print args stehen die args im
list-Kontext. Grep in list-Kontext gibt eine Liste aller Treffer
zurueck. Grep in skalarem Kontext gibt die Anzahl der Treffer zurueck.

Ein +0 erzwingt skalaren Kontext:

~> perl -le 'print @ARGV' 1 2 3 4
1234

~> perl -le 'print @ARGV+0' 1 2 3 4
4

Ein Array gibt in skalarem Kontext die Anzahl seiner Elemente zurueck.

Ein weitere Funktion, die sich je nach Kontext scheinbar vollkommen
verschieden verhaelt ist 'localtime':

~> perl -le 'print localtime'
36162011012500

~> perl -le 'print scalar(localtime)'
Tue Feb 20 16:06:37 2001

Dieses Verhalten kann einen manchmal ganz schoen reinlegen... ;)

Gruss,

Jens.



Mehr Informationen über die Mailingliste linux-l