Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Perl/CGI » An Textdatei Variablen übergeben

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
31.08.2003, 15:48 Uhr
~worst_case
Gast


Hi,

ich habe eine Template-Datei in der folgendes steht.

aktuelle Temperatur: $wert[1][0] C;

usw.

Ich möchte nun die Datei einlesen, die Variable $wert[1][0] (Inhalt), die in meinem Perlscript erzeugt wird, übergeben und in eine neue Datei speichern.

Danach soll es so aussehen

aktuelle Temperatur: 34 C;

Das mit dem einlesen und ausgeben ist kein Problem. Doch wie zeige ich dem Script das $wert[1][0] kein Text ist sondern eine Variable sein soll ?

Danke
worst_case
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
31.08.2003, 16:35 Uhr
virtual
Sexiest Bit alive
(Operator)



Code:
$variable = 4711;
# Das einfache Quote verhindert die Ersetzung der Variablen:
$zeile = '$variable war die Nummer eines Hauses zur Zeit der französischesn Besetzung Kölns';
print "Die zeile lautet ohne Ersetzung: $zeile\n";
# Ersetze alle Variablen
$zeile=~ s/\$(\w+)/${$1}/g;
print "Die zeile lautet mit Ersetzung: $zeile\n";


Das funktioniert zunächst nur für einfache Variablen, ohne Array-Subscripting.
Denkbar wäre also noch eine entsprechende Anpassung der regulären Ausdrucks in der vorletzten Zeile. Aber die Idee ist klar, hoffe ich.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
31.08.2003, 17:42 Uhr
~worst_case
Gast


Hi, $zeile =~ s/\$(\w+) /${$1}/g;

ich danke dir für dein Vertrauen.....
quote : Aber die Idee ist klar, hoffe ich.

Wenn ich ehrlich bin.... nicht ganz.

Ich versuche mal das zu deuten :
$zeile =~ s/\$(\w+) /${$1}/g;

=~ lesen und wieder schreiben (klar)
s/ = suche (klar)
$(\w+) = suche nach $ und zusätzlich nach ein oder mehreren Buchstaben/Zahlen Unterstrich usw. (Warum jedoch die Klammer AUF/ZU ?)
/ = ersetzen (klar)
${$1} = ???????????
/g = mehrmals wiederholen (klar)

Ich habe auch das Beispiel getestet mit der variable $datum (die ich belegt habe) und es kommt jedoch eine Fehlermeldung: "Can' use a String as a Scalar"
Jetzt kommen noch mehr ????

worst_case
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
31.08.2003, 18:34 Uhr
virtual
Sexiest Bit alive
(Operator)



Code:
$zeile =~ s/\$(\w+) /${$1}/g;


Das s/x/y/g bedeutet: Substituiiere (ersetze) alle x durch ein y. x ist dabei ein regulärter ausdruck. Gucken wir uns mal erstmal das x an:
ist "\$(\w+)". Also wird alles gemacht, was mit einem Dollarzeichen beginnt und danach mindestens einen Buchstaben, Ziffer oder Undwerscore besitzt. Die Klammern bedeuten, daß man den Teil ohne das Dollar später unter $1 im y wieder ansprechen kann. Nehmen wir mal an, du hättest die Aufgabe eine Zeitangabe der Form HH:MM:SS umzustellen in einen String der Form "SS sekunden, MM Minuten und HH Stunden", so würde das so gehen:

Code:
$zeit = "12:34:56";
$zeit =~ s/(\d{2}):(\d{2}):(\d{2})/$3 sekunden, $2 Minuten und $1 Stunden";


Aber zurück zu unserem Bespiel:
Wenn wir in Zeile "$var" stehen hätten, könnten wir also im Replacement teil unter $1 das "var" wiederfinden: "${$1}" bedeutet also "${var}", folglich wird das Replacement dann der Inhalt der Variablen var sein.

Zu Deinem Problem mit dem $datum kann ich mangels Source nix sagen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 31.08.2003 um 18:35 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
31.08.2003, 20:33 Uhr
~worst_case
Gast


Abend Virtual,

hier mal mein kompletter Code:

Code:

Code:
#!/usr/bin/perl -w

use strict;
use CGI::Carp qw (fatalsToBrowser);

# Pfad in dem die Daten-Dateien stehen (mit Slash am Ende)
my $datapath = "/srv/www/htdocs/data/";
# aus dieser Datei werden die Messwerte gelesen (Reihenfolge beachten)
my @datafiles = qw (data_mpi_10 data_mpi_11 data_mpi_12);

# Path des datafiles (wo alle Daten von SPS gespeichert werden)
my $template = "/srv/www/htdocs/sms/smstemplate";
my $smsfile = "/srv/www/htdocs/sms/smsfile";

# Variablen
my $file;
my @values;
my $file_count = 0;



        (my $sek, my $min, my $h, my $mtag, my $monat, my $jahr) = localtime();
        my $zeit = $h.".".$min."Uhr";
        my $datum = $mtag.".".($monat + 1).".".($jahr + 1900);

#einlesen sämtlicher Daten (Zentrale / M1 / M2)

            foreach (@datafiles)
                {
                    open ($file , "<".$datapath."$_") || die "$datapath.$_ konnte im Script '$0' nicht geoeffnet werden";
                 my @lines = <$file>;
                    close ($file);

             # Im Array "values" steht Referenz auf diese Array "lines"
            $values[$file_count++] = \ @lines;
                    }


my $fptemplatefile;
my $fpsmsfile;
my @ausgabe;
my $zeile;

# Template oeffnen

    open ($fptemplatefile, "<".$template) || die "$template konnte vom Script '$0' nicht geöffnet werden";
    open ($fpsmsfile, ">".$smsfile) || die "$smsfile konnte vom Script '$0' nicht geöffnet werden";

        while(<$fptemplatefile>)
        {
        chomp;
        $zeile = $_;
                print "$zeile\n";
        $zeile =~ s/(\$\w+) /$1/g;  
                print "$zeile\n";
        print $fpsmsfile $zeile."\n";
        }
        
    close ($fptemplatefile);
    close ($fpsmsfile);

########################################################################


Sinn bzw. Unsinn der Sache.
Ich hole mir von bestimmten Dateien Werte und lege diese auf ein zweidimensionales Scalare ($values[1][9]
Die erste Nummer ist die Datei, die zweite die Zeilennummer
Dann lese ich meine Vorlage ein in der z.B. steht
-------------------------------------------------------------------------

Code:
$zeit Uhr // $datum
Temperatur: $values[1][10] C



Diese "Variablen" will ich gegen den Inhalt von Variablen (mit dem gleichen Namen) aus dem Perl-Script austauschen ersetzen.
Wenn ich teste wird zwar die Variable ersetzt (durch den Namen der Variable) jedoch nicht gegen den Inhalt.
Vielleicht sehe ich den Wald vor lauter Bäumen nicht.

Danke
worst_case
--edit: Pablo. [ code ] tags gesetzt--

Dieser Post wurde am 31.08.2003 um 21:07 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
01.09.2003, 08:06 Uhr
virtual
Sexiest Bit alive
(Operator)


Benutzt Du immer feste Zahlen als Index?
Benutzt du nur 2D-Arrays?
Wenn Du beide Fragen mit Ja benatwortetst, würde ich es so probieren:

Code:
$zeile =~ s/\$(\w+)\[(\d+)\]\[(\d+)\]/${$1}[$2][$3]/g;


Was in Deinem Code jedenfalls falsch ist:

Code:
$zeile =~ s/(\$\w+) /$1/g;


Das "$" Zeichen sollte nicht mitgematcht werden, also besser

Code:
$zeile =~ s/\$(\w+) /${$1}/g;


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 01.09.2003 um 08:07 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Perl/CGI ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: