Scalar in Variable ändern
Friedhelm
- perl
0 Matti Maekitalo0 Friedhelm0 Matti Maekitalo
Hallo Zusammen,
ich komme mit folgender Problematik nicht weiter und versuche es zu erklären. Ich lese aus einer Datei einen String ein und möchte den Inhalt dieses Strings als Variable benutzen.
Das kann dann z.B. so aussehen:
$text = "..\dir\index.html";
$var1 = "$text"; # $var1 wird jetzt z.B. ein Scalar ausgelesen
# aus einer Datei zugewiesen, dass als String
# die Variable $text beinhaltet.
print $var1; # Hier erscheint jetzt natürlich $text,
# ich möchte aber, dass hier ..\dir\index.html
# erscheint.
Wir bekomme ich den Inhalte dieses Strings $var1 als Variable definiert?
Kann jemand helfen?
Danke und Gruß
Friedhelm
use Mosche;
Hallo Zusammen,
ich komme mit folgender Problematik nicht weiter und versuche es zu erklären. Ich lese aus einer Datei einen String ein und möchte den Inhalt dieses Strings als Variable benutzen.
Das kann dann z.B. so aussehen:
$text = "..\dir\index.html";
Perl ist insofern plattformunabhängig, dass es intern Pfadangaben immer mit / kennzeichnet, OS unabhängig.
$var1 = "$text"; # $var1 wird jetzt z.B. ein Scalar ausgelesen
# aus einer Datei zugewiesen, dass als String
# die Variable $text beinhaltet.
Denn Kommentar verstehe ich nicht.
Jetzt gilt:
$var1 eq '..\dir\index.html'
Im Übrigen sind Gänsefüßchen in dem Falle unnötig:
$var1 = $test; # jetzt hat $var1 den gleichen Inhalt wie $test
Wenn du $var1 = '$test' angibst (Hochkommata, keine Gänsefüßchen), dann gilt:
$var1 eq '$test'
Ich möchte jetzt den String als Variable $text nutzen, z.B. so:
print $var1; # Hier erscheint jetzt natürlich $text,
# ich möchte aber, dass hier ..\dir\index.html
# erscheint.
Wenn du es mit Gänsefüßchen machst, sollte genau dies geschehen.
Wir bekomme ich den Inhalte dieses Strings $var1 als Variable definiert?
Kann jemand helfen?
Wenn du nochmal genau deine Fragestellung stellen könntest, wäre dies sehr hilfreich. Achte mal bitte auf deine Satzstellung, dass könnte das ganze ein wenig einfacher machen, in diesem Posting ist vieles ziemlich wirr. Ein kleiner Testcode mit Ausgabe und mit der gewünschten Ausgabe wäre auch nicht schlecht.
use Tschoe qw(Matti);
Okay, ich fange noch einmal an und versuche das Problem etwas klarer zu machen.
Hier ist der Code-Schnipsel:
$var1 = "../dir/text.html";
$var2 = "$var1";
print $var2; # Ausgabe ist: $var1
Ich möchte allerdings, dass nicht $var1 ausgegeben wird,
sondern der Inhalt der Variable $var1, nämlich ../dir/text.html.
Dazu müßte der String, der in der Variablen $var2 steht,
zu einer Variablen gewandelt werden.
Wie geht das?
Ich hoffe Du kannst mir jetzt helfen?
Danke und Gruß
Friedhelm
use Mosche;
Es gibt eine Variable var1 mit irgendeinem String,
z.B. mit einer Verzeichnisangabe.
$var1 = "../dir/text.html";
Es gibt eine zweite Variable var2 mit einem String,
in dem als String "$var1" steht.
$var2 = "$var1";
Bei der Ausgabe von $var2 passiert folgendes:
print $var2; # Ausgabe ist: $var1
Nein. Wenn du doppelte Anführungsstrichelchen ("Gänsefüßchen") verwendest, dann wird der String "$var1" interpoliert, d.h., es wird nach im String enthaltenen Variablen gesucht, welche durch ihren Inhalt ersetzt werden. Wenn du Hochkommata verwendest, _dann_ ist der Inhalt von $var2 $var1.
Die Ausgabe dort ist also "../dir/test.html".
Wenn du nur den Inhalt der Variablen kopieren willst, solltest du das sowieso anders machen:
$var2 = $var1; kopiert den Inhalt.
use Tschoe qw(Matti);
Es gibt eine Variable var1 mit irgendeinem String,
z.B. mit einer Verzeichnisangabe.
$var1 = "../dir/text.html";
Es gibt eine zweite Variable var2 mit einem String,
in dem als String "$var1" steht.
$var2 = "$var1";
Bei der Ausgabe von $var2 passiert folgendes:
print $var2; # Ausgabe ist: $var1
Nein. Wenn du doppelte Anführungsstrichelchen ("Gänsefüßchen") verwendest, dann wird der String "$var1" interpoliert, d.h., es wird nach im String enthaltenen Variablen gesucht, welche durch ihren Inhalt ersetzt werden. Wenn du Hochkommata verwendest, _dann_ ist der Inhalt von $var2 $var1.
Die Ausgabe dort ist also "../dir/test.html".
»»»» Das passiert aber leider nicht!
Paß auf. das Problem ist folgendes. Ich lese eine Textdatei während der Laufzeit ein. Innerhalb dieser Textdatei befindet sich HTML Code, der ganz normal ausgegeben wird. Das ist kein Problem. Jetzt möchte ich aber dort eine Variable unterbringen, die in meinem Perl Programm definiert ist, die dann auch interpretiert und ausgegeben werden soll.
Jetzt liest Perl diese Variable natürlich als String ein und gibt sie auch als Text-String aus.
$var1 ist in meinem Programm definiert mit "../dir/text.html"
Jetzt lese ich in $var2 aus der Datei den Text-String $var1 ein. $var1 ist leider ein Text. Setze ich print "$var2";, dann wird $var1 ausgegeben. Setze ich print '$var2';, dann wird $var2 ausgegeben.
Ich möchte aber, dass der Inhalte der Variablen $var1, die im Programm definiert ist mit "../dir/text.html" ausgegeben wird und das passiert eben nicht.
Ich brauche irgend etwas, was mir aus einem String der den Text einer Variable beinhaltet, den Inhalt der Variable zaubert. Also eine Art Konverter von String zu Variable.
Danke und Gruß
Friedhelm
Hallo Friedhelm.
Paß auf. das Problem ist folgendes. Ich lese eine Textdatei während der Laufzeit ein. Innerhalb dieser Textdatei befindet sich HTML Code, der ganz normal ausgegeben wird. Das ist kein Problem. Jetzt möchte ich aber dort eine Variable unterbringen, die in meinem Perl Programm definiert ist, die dann auch interpretiert und ausgegeben werden soll.
Da empfiehlt sich die Verwendung des Moduls HTML::Template:
http://search.cpan.org/~samtregar/HTML-Template-2.6/Template.pm
Simples Beispiel:
Du schreibst innerhalb des in der Datei enthaltenen HTML-Codes nicht $var1, sondern <TMPL_VAR NAME="VAR">. In deinem Perlscript gibst du das Ganze dann so aus:
use HTML::Template;
...
my $template = HTML::Template->new( filename => 'deine_datei' );
$template->param( VAR => $var2,
# weitere Felder
);
print "Content-Type: text/html\n\n", $template->output;
}
Grüße
Siechfred
Hallo,
ich glaube, Du suchst nach Zeigern (bin mir aber auch nicht ganz sicher...):
$var1 = '../blah/blub';
$var2 = $var1;
print $var2;
print ${$var2};
print $var1;
Ein Tutorial zu Zeigern (in Perl engl. "References") gibt es unter http://www.perldoc.com/perl5.8.0/pod/perlreftut.html.
Simon
Hallo Simon,
ich glaube, Du suchst nach Zeigern (bin mir aber auch nicht ganz sicher...):
Zeiger gibt es in Perl nicht, da heisst das Referenz ;-) Und nein, das ist nicht das Gleiche.
Schonmal versucht, eine Referenz um 2 Byte nach oben oder nach unten zu setzen? Nein? Geht
auch nicht. Bei Zeigern geht das.
Aber nein, er sucht eigentlich nur eine Template-Engine. Und da eignet sich das von Siechfred
benannte HTML::Template recht gut (es sei denn, man braucht es Performant).
Grüße,
CK
Hallo Zusammen,
ich glaube die Idee mit HTML::Template müßte passen! Meine Problem liegt zwischen embedded Perl und einem einfachen HTML/Perl-Variablen Ersetzer. HTML::Template ist bei meinem Provider auch als Modul installiert!
Ich habe mir die Doku bei CPAN durchgeschaut - dies müßte passen. Wie performant dies ist - na da schaun´ wir mal.
Ich suche trotzdem weiterhin nach einer alternativen Lösung. Die Idee mit der Referenz find ich gut und werde ich mal weiterverfolgen.
Bis dahin erst einmal besten Dank für Eure tolle Unterstützung!
Friedhelm