Perl-Variable in String
Bautz
- perl
0 KurtZ0 Jurik0 Patrick Andrieu0 KurtZ0 Patrick Andrieu0 KurtZ0 Patrick Andrieu0 KurtZ
Hallo,
Bewirken die beiden nachfolgenden Statements das gleiche oder worin besteht der Unterschied?
$erg = $var . " ist fehlerhaft";
$erg = "$var ist fehlerhaft";
Gruß
Bautz
Kurtz gegrüßt
Bewirken die beiden nachfolgenden Statements das gleiche oder worin besteht der Unterschied?
$erg = $var . " ist fehlerhaft";
$erg = "$var ist fehlerhaft";
Ich wüsste keinen Unterschied, den man nicht ziemlich künstlich konstruieren müsste.
Grüße
Kurt
Also wenn Perl wie PHP Tickt kommt das gleiche heraus.
ABER:
$erg = $var.' ist fehlerhaft';
<- sollte man schreiben damit der Parser nicht das in den einfachen Anführungszeichen parst.
$erg = "$var ist fehlerhaft"
<- schreibt man mit doppelten Anführungszeichen, damit der Parser alles dazwischen parst und somit aus der Variablen den Inhalt darstellt.
Die erste Variante ist performanter bei großen Texten, da der Parser weniger arbeiten muss. Nur muß man dann bestimmte Zeichen mit einem '' escapen.
Viele Grüße,
Jurik
Hallo Jurik!
$erg = "$var ist fehlerhaft"
<- schreibt man mit doppelten Anführungszeichen, damit der Parser alles dazwischen parst und somit aus der Variablen den Inhalt darstellt.
In Perl spricht man von »Interpolation«.
Die erste Variante ist performanter bei großen Texten, da der Parser weniger arbeiten muss. Nur muß man dann bestimmte Zeichen mit einem '' escapen.
Irgendwo habe ich gelesen, dass die Zeichenkettenverpknüpfung (concatenation) in Perl etwas auf Kosten der Performance geht. Kann das jemand bestätigen?
Viele Grüße aus Frankfurt/Main,
Patrick
Kurtz gegrüßt
Irgendwo habe ich gelesen, dass die Zeichenkettenverpknüpfung (concatenation) in Perl etwas auf Kosten der Performance geht. Kann das jemand bestätigen?
ich erinnere mich dunkel, dass vom Perlcompiler eine Interpolation intern zum Stringconcat umgewandelt wird.
stand imho irgendwo in den Perldocs.
an der Interpretationsgeschwindigkeit sollte das aber nix ändern, nur an der Compilierzeit.
Grüße
Kurt
Hallo KurtZ!
ich erinnere mich dunkel, dass vom Perlcompiler eine Interpolation intern zum Stringconcat umgewandelt wird.
Das würde die Fehlermeldung: »Use of unitialized value in _concatenation_ (.) _or_ _string_ at _ line ..." erklären, ja...
stand imho irgendwo in den Perldocs.
Ich weiß leider wirklich nicht mehr wo, vielleicht betraf es ja auch die direkte Übergabe an print(), denn ich meine, mich zu erinnern, es sei besser zu schreiben:
print $var, " ist fehlerhaft";
als
print $var." ist fehlerhaft";
Viele Grüße aus Frankfurt/Main,
Patrick
hi
Ich weiß leider wirklich nicht mehr wo, vielleicht betraf es ja auch die direkte Übergabe an print(), denn ich meine, mich zu erinnern, es sei besser zu schreiben:
print $var, " ist fehlerhaft";
als
print $var." ist fehlerhaft";
das ist jetzt aber auch ein ganz anderes thema, Komma trennt ne Liste udn macht kein concat.
Grüße
Kurt
Hallo KurtZ!
Komma trennt ne Liste udn macht kein concat.
Ja, klar. Ich habe mittlerweile die Stelle gefunden, die mich zu der Annahme brachte, die Zeichenkettenverknüpfung sei weniger performant. Es steht ganz zu Beginn von »Einführung in Perl«, Kapitel 2 »Skalare Daten«, Abschnitt »Ausgaben mit print« (in meiner Ausgabe, Seite 32ff):
$was = "Brontosaurier-Steak";
$n = 3;
print "Fred aß $n $wass.\n"; # Keine Steaks, sondern der Wert
# von $wass
print "Fred aß ${was}s.\n"; # Jetzt wird $was benutzt
print "Fred aß $was" . "s.\n"; # eine andere Art, das gleiche
# zu tun
print 'Fred aß ' . $n . ' ' . $was . "s.\n"; # eine besonders
# aufwendige Methode
Den letzten Kommentar hatte ich wohl als »wenig perfomant« interpretiert, obwohl dies damit nicht gemeint ist... oder habe ich das doch woanders gelesen...?
Viele Grüße aus Frankfurt/Main,
Patrick
Kurtz gegrüßt
Den letzten Kommentar hatte ich wohl als »wenig perfomant« interpretiert, obwohl dies damit nicht gemeint ist... oder habe ich das doch woanders gelesen...?
könnte sein dass ichs auch gelesen habe, aber ich finds wirklich nicht dramatisch wichtig ...
Grüße
Kurt
Hallo KurtZ!
ich finds wirklich nicht dramatisch wichtig ...
Ich auch nicht, war nur neugierig, ob jemand sowas auch bereits gelesen hatte.
Viele Grüße aus Frankfurt/Main,
Patrick
Ich auch nicht, war nur neugierig, ob jemand sowas auch bereits gelesen hatte.
Der Punkt ist, wenn du print $a.$b.$c; schreibst, wird erst der String verknüpft und dann ausgegeben, während bei print $a,$b,$c; die Strings nacheinander ausgegeben werden. D.h. das Ergebniss ist das Gleiche, aber der Aufwand der Verknüpfung kann u.U. enorm groß werden, wenn die Strings länger sind. Daher ist die Listenschreibweise vorzuziehen.
Struppi.
Hallo Struppi!
Der Punkt ist, wenn du print $a.$b.$c; schreibst, wird erst der String verknüpft und dann ausgegeben, während bei print $a,$b,$c; die Strings nacheinander ausgegeben werden. D.h. das Ergebniss ist das Gleiche, aber der Aufwand der Verknüpfung kann u.U. enorm groß werden, wenn die Strings länger sind. Daher ist die Listenschreibweise vorzuziehen.
Ah, danke. Eben sowas hatte ich schon irgendwo gelesen, vielleicht hier im Forum sogar...
Wenn wir schon mal dabei sind, ist die Benutzung von »qq//« vorzuziehen, sowohl um Strings zu schreiben, als auch »direkt« bei einer print-Anweisung?
$quotemix = qq~Struppi sagt: "Mir geht's wieder gut"~;
print qq~Just another "quote chars 'mix'"~;
push (@arr, qq~I'm going to fill Array "arr"~);
So spart man sich ja die Maskiererei, hat es aber auch Nachteile?
Viele Grüße aus Frankfurt/Main,
Patrick
Wenn wir schon mal dabei sind, ist die Benutzung von »qq//« vorzuziehen, sowohl um Strings zu schreiben, als auch »direkt« bei einer print-Anweisung?
Ich würd die Frage ob du hier ein paar Mikrosekunden bei der Ausgabe sparst nicht überbewerten und im zweifelsfall die leserliche Variante wählen. Und da sind die Quote-operators natürlich eine gute Wahl zumal diese auch über mehrere Zeilen gehen können.
$quotemix = qq~Struppi sagt: "Mir geht's wieder gut"~;
Jaja ;-)
Blinddarm ist anscheinend nicht so schlimm (nur bei der Einlieferung in's Krankenhaus, weil ich nichts gemerkt habe und innerhalb von drei Stunden wurd's dann richtig akut).
Struppi.
Hallo Struppi!
im zweifelsfall die leserliche Variante wählen. Und da sind die Quote-operators natürlich eine gute Wahl zumal diese auch über mehrere Zeilen gehen können.
Ja, leserlicher, tipparbeitssparender... also eher mehr Vorteile.
$quotemix = qq~Struppi sagt: "Mir geht's wieder gut"~;
Jaja ;-)
Blinddarm ist anscheinend nicht so schlimm (nur bei der Einlieferung in's Krankenhaus, weil ich nichts gemerkt habe und innerhalb von drei Stunden wurd's dann richtig akut).
Ich habe bisher Glück gehabt und habe noch alles (Blinddarm, Mandeln... einige Milligramm Hirn sind auch noch vorhanden)... ;)
Viele Grüße aus Frankfurt/Main,
Patrick