Perl string zwischen Hochkomma und Anführunsgzeichen wandeln

  • Ersteller aktivfrühstück
  • Erstellt am
A

aktivfrühstück

Eroberer
Hey Leute,
hab ne Frage.

Möchte eine Formel in einer Perl Ausgabe darstellen.

als Beispiel:
Zeile im Skript:Formel: $ergebnis = $wert1 + $wert 2 / $wert3

zum kontrollieren ob diese Formel richtig funktioniert benötige ich folgende Ausgabe in einer Print-Anweisung:
Code:
1.Zeile: $ergebnis = $wert1 + $wert 2 / $wert3  # zeigt mir wie die Variablen heißen (Darstellung als String)
2.Zeile: 10 = 5 + 10 / 2 # zeigt mir den aktuellen Ihnahlt dieser Variablen


Ziel ist es die Formel, welche Zentral im Skript steht verändern zu können, sodass sich automatisch die Ausgabe in einer Printanweisung anpasst.

Ich muß also einmal die Formel als Quellcode speichern um Zeile 1 zu bekommen. Dann muß die Formel als Zahlen gespeichert werden um sie berechnen zu können und als letztes muß sie berechnet werden.

1.Als Quellcode speichern-> kein Problem (Ausgabe Zeile 1)
Code:
$quellcode = '$ergebnis = $wert1 + $wert 2 / $wert3';
2.ergebnis berechnen-> kein Problem mittels eval() Funktion (Ausgabe Zeile 2 -> Ergebnis)
Code:
$ergebnis = eval "$quellcode";

Jetzt kommt das Problem:
Wie kann ich den Inhalt von $quellcode so konvertieren, dass perl es interpretiert als würde die Zeile wiefolgt aussehen:
Code:
$quellcode = "$ergebnis = $wert1 + $wert 2 / $wert3"; # Doppelhochkomma ist wichtig-> pperl interpretiert nun die Werte der Variablen in der Ausgabe als Zahlen und nicht als String

Hoffe das war nicht zu kompliziert... Vll gibt es auch noch einen anderen Weg um zum Ziel zu gelangen und jmd kennt den:)
Viele Grüße
 
Hi,

versuch mal die $-Zeichen mit einem \ zu escapen, dann sollte es gehen.

Viele Grüße
Marcus
 
Mittels PaternMatching die $ von $quellcode nach \$ ?
Also suchen und erezten?
 
Ich würds so machen:
Code:
use strict;
use warnings;

my $foo = 43;
my $bar = 3.14;
my $formula = '$foo + $bar';

my $result = eval $formula;
my $resolved = eval "qq{$formula}";
print "$resolved == $result\n";

$foo = 17;
$bar = 23;

$result = eval $formula;
$resolved = eval "qq{$formula}";
print "$resolved == $result\n";

Aber bedenke: stringeval ist evil. Wenn die Werte vom User eingelesen werden, kann dieser quasi unbegrenzt perlcode einschleusen, der dann unter dem Benutzer, unter dem das Skript gestartet wurde ausgeführt wird.
Für den Fall, dass du das Skript irgendwo "öffentlich" laufen lassen willst, würde ich dir für eval das (in der Core Distribution vorhandene) Safe Modul empfehlen.

Es gibt auch ein Modul auf cpan, das solche Formeln evaluiert ohne die eval Funktion. Das wäre der sicherste Weg, mir fällt nur grade der Name des Moduls nicht mehr ein.
 

Ähnliche Themen

Spalten einer Datei in neue Datei integrieren.

Mehere Strings aus unterschiedlichen Zeilen zusammenführen

Shell if-Abfrage mit equal or greater wirft Fehlermeldung unary operator expected

awk: Dateiinhalt/Variableninhalt als Teil einer if-Anweisung

OpenSUSE 12.1: Gnucash startet nicht mehr

Zurück
Oben