Roger: Variablendatei in PHP und Perl nutzen

hi!
dumm is, wenn eine seite mit zwei sprachen läuft, sogn. "hybridseite" ;)
denn immer wenn variablen geändert werden müssen, muss das doppelt geschehen.

hauptsächlich greifen die perl-scripte auf eine datei data.pl zurück, in der alle variablen integriert sind:

$daten1 = "test.dat";
$email = "email@domain.de";

usw.

am ende steht ja dann noch 1; , da die daten.pl dann im eigentlichen skript per require eingebunden werden.

kann man die variablen in der datei auch für php-skripte nutzen, bzw. gibt's eine möglichkeit, variablen für beide zu nutzen (in einer datei)?

danke für eure antworten.
mfg roger.

  1. Hi,

    gibt's eine möglichkeit, variablen für beide zu nutzen (in einer datei)?

    mach daraus eine (z.B. tabulatorgetrennte) CSV-Datei; erste Spalte Variablenname, Rest Variablenwert. Das lässt sich mit üblichen Dateioperationen sprachunabhängig einlesen. Die Variablen solltest Du sicherheitshalber in einem Hash (Perl) bzw. assoziativen Array (PHP) speichern, anstatt mit eval() [1] u.ä. daraus "echte" Variablen zu generieren.

    Cheatah

    [1] eval() is evil()

    1. hm, danke.
      hatte eigentlich auch schon daran gedacht, aber insgeheim gehofft es gäbe eine einfachere lösung (->faul).

      thanx!

      1. Hi,

        insgeheim gehofft es gäbe eine einfachere lösung (->faul).

        kann schon sein. Ich halte das aber nicht für wirklich sinnvoll - im Detail haben Sprachen immer Unterschiede, und es ist sehr schwer, sie ausnahmslos alle zu beachten. Im Zweifel funktioniert ein solches Prinzip plötzlich nicht mehr, und dann hast Du Probleme, die Du _schnell_ und an _vielen_ Stellen lösen musst.

        Schreib Dir lieber je eine (allgemeine) Einlese-Datei/-Funktion für Perl und für PHP, und halte die Datei in einem Format, das _Du_ definierst. Damit sparst Du Dir auf Dauer Probleme - und wenn sich die Anforderungen ändern, änderst Du exakt (bzw. maximal) zwei Dateien.

        Cheatah

    2. Die Variablen solltest Du sicherheitshalber in einem Hash (Perl) bzw. assoziativen Array (PHP) speichern, anstatt mit eval() [1] u.ä. daraus "echte" Variablen zu generieren.

      hilf mir bitte nochmal kurz weiter (mein perl ist ein wenig eingerostet).
      ich lass die daten zeilenweise einlesen (@vars) und splitte sie dann auf.
      sieht dan so aus:

      open (DAT , "<daten/variables.csv");
      while ($var_line=<DAT>)
      {
       push ( @vars , $var_line );
      }
      close(DAT);

      $lines=0;
      foreach $var_line (@vars)
      {
       push ( @temp , [ split(/;/ , $var_line) ] );
       $lines++;
      }

      jetzt hab ich aber alles im @temp. wenn ich mich richtig erinner', kann ich jetzt die einzelnen felder ala $temp[0][1] oder so ansprechen, aber wie krieg ich das hin, das $temp[0][0] (variablenname) nun mal zur variable wird, der dann auch noch $temp[0][1] (variableninhalt) zugewiesen wird?

      roger.

      1. Hi,

        open (DAT , "<daten/variables.csv");

        open(DAT, '<daten/variables.csv') or die "Kann variables.csv nicht oeffnen: $!";

        while ($var_line=<DAT>)

        while (my $var_line=<DAT>) {

        (Du hast doch 'use strict;' eingebunden und 'perl -w' in die Shebang geschrieben, oder?)

        push ( @vars , $var_line );

        Hm. Da reicht ein

        my @vars = <DAT>;

        Außerdem steht in perldoc perlstyle einiges zu Klammer- und IIRC auch über Kommasetzung drin... ;-)

        $lines=0;
        foreach $var_line (@vars)

        for (my $lines=0; $lines<scalar @vars; $lines++) {

        Außerdem kannst Du das eigentlich auch machen, während Du die Datei zeilenweise einliest. Du brauchst die Daten schließlich nur im Hash, nicht zusätzlich im Array, oder?

        push ( @temp , [ split(/;/ , $var_line) ] );

        Gar nicht übel. Ich würde aber in

        perldoc -f split

        nachlesen, was der optionale dritte Parameter bewirkt ;-) und erst mal Name und Wert der Zeile in 'my ($name, $wert) = split(...);' speichern.

        jetzt hab ich aber alles im @temp.

        Richtig. Du willst es aber in %vars haben, um auf $vars{'bla'} zugreifen zu können. Also was tust Du? ;-)

        wenn ich mich richtig erinner', kann ich jetzt die einzelnen felder ala $temp[0][1] oder so ansprechen,

        Nönö, Lists Of Lists sind in Perl (leider) ein wenig komplizierter. Wenn's Dich interessiert, lies perldoc perllol - aber für ein Hash brauchst Du das nicht.

        aber wie krieg ich das hin, das $temp[0][0] (variablenname) nun mal zur variable wird, der dann auch noch $temp[0][1] (variableninhalt) zugewiesen wird?

        Falscher Datentyp ;-) Siehe perldoc perldata

        Cheatah

        1. Hi,

          Richtig. Du willst es aber in %vars haben, um auf $vars{'bla'} zugreifen zu können. Also was tust Du? ;-)

          jaja, schon klar. aber ich will doch nicht mit $temp{'email'} arbeiten, sondern mit $email. da liegt doch denke ich mir der hase im dings... äh pfeffer.

          der inhalt meines arrays soll eine variable werden.

          ...

          ???

          r.

          1. Hi,

            jaja, schon klar. aber ich will doch nicht mit $temp{'email'} arbeiten, sondern mit $email.

            und exakt davon rate ich Dir ab. Sowas kann schnell in die Hose gehen, wenn der Name auch nur ein *bisschen* falsch ist - oder jemand bewusst manipuliert hat.

            Wenn Du *unbedingt* darauf bestehst, kannst Du mit eval()[1] arbeiten; das gibt's AFAIK in Perl und PHP. Perl hat noch eine weitere Möglichkeit, die ich auch nur bedingt empfehlen kann:

            ${'bla'} = 'blub';
            print $bla;

            Allerdings kannst Du dann keine strict refs mehr nutzen, und für den -w-Switch solltest Du alle(!) verwendeten Variablen durch 'use vars' anmelden. Bedenke, dass Du Dir in *jedem* Fall mit sowas mehr Probleme schaffen kannst, als Du jemals an Nutzen haben könntest - nur weil es "funzt" heißt das nicht, dass auf ewig alles in Ordnung ist. Man sollte *niemals* Variablen mit vorher unbekannten Namen generieren lassen!

            der inhalt meines arrays soll eine variable werden.

            Nein, soll er nicht. Du _willst_, dass er eine Variable wird.

            Cheatah

            [1] Lass es. eval() ist hochgradig gefährlich; insbesondere wenn das Programm die ausgeführten Daten nicht hundertprozentig kennt.

            1. Hi,

              jaja, schon klar. aber ich will doch nicht mit $temp{'email'} arbeiten, sondern mit $email.

              und exakt davon rate ich Dir ab. Sowas kann schnell in die Hose gehen, wenn der Name auch nur ein *bisschen* falsch ist - oder jemand bewusst manipuliert hat.

              Wenn Du *unbedingt* darauf bestehst, kannst Du mit eval()[1] arbeiten; das gibt's AFAIK in Perl und PHP. Perl hat noch eine weitere Möglichkeit, die ich auch nur bedingt empfehlen kann:

              ${'bla'} = 'blub';
              print $bla;

              Allerdings kannst Du dann keine strict refs mehr nutzen, und für den -w-Switch solltest Du alle(!) verwendeten Variablen durch 'use vars' anmelden. Bedenke, dass Du Dir in *jedem* Fall mit sowas mehr Probleme schaffen kannst, als Du jemals an Nutzen haben könntest - nur weil es "funzt" heißt das nicht, dass auf ewig alles in Ordnung ist. Man sollte *niemals* Variablen mit vorher unbekannten Namen generieren lassen!

              der inhalt meines arrays soll eine variable werden.

              Nein, soll er nicht. Du _willst_, dass er eine Variable wird.

              Cheatah

              [1] Lass es. eval() ist hochgradig gefährlich; insbesondere wenn das Programm die ausgeführten Daten nicht hundertprozentig kennt.

            2. Hi,

              Wenn Du *unbedingt* darauf bestehst, kannst Du mit eval()[1] arbeiten; das gibt's AFAIK in Perl und PHP. Perl hat noch eine weitere Möglichkeit, die ich auch nur bedingt empfehlen kann:

              ${'bla'} = 'blub';
              print $bla;

              cool, probier ich doch glatt mal aus. danke.

              Allerdings kannst Du dann keine strict refs mehr nutzen, und für den -w-Switch solltest Du alle(!) verwendeten Variablen durch 'use vars' anmelden. Bedenke, dass Du Dir in *jedem* Fall mit sowas mehr Probleme schaffen kannst, als Du jemals an Nutzen haben könntest - nur weil es "funzt" heißt das nicht, dass auf ewig alles in Ordnung ist. Man sollte *niemals* Variablen mit vorher unbekannten Namen generieren lassen!

              naja, die variablen sind doch schon vorgegeben (in der "variablen datei"). ich will doch nur aus zwei dateien eine datei machen, die perl und php gleichzeitig schnallen.
              die darin verwendeten veriablennamen existieren ja schon im skript, deshalb ist es mir nicht möglich nun $temp{'blah'} für $blah zu schreiben. zumindest ist dann der aufwand höher als der nutzen...

              danke für die tips!

              r.

              [1] Lass es. eval() ist hochgradig gefährlich; insbesondere wenn das Programm die ausgeführten Daten nicht hundertprozentig kennt.

              har har! no risk no fun! :)

              1. Hi,

                ${'bla'} = 'blub';
                print $bla;
                cool,

                aus diesem Grund sind Reaktionen der Art "Warum gebt ihr nicht einfach ein Beispiel, anstatt zu belehren, dass man es nicht tun sollte?", wie man sie gelegentlich in Foren sieht, undurchdacht. Das ist _nicht_ cool, sondern gefährlich.

                naja, die variablen sind doch schon vorgegeben

                Nein. Die _Namen_ sind vorgegeben. Das müssen keine Variablennamen sein, sondern können auch Namen in einem Hash sein. Du greifst geringfügig anders darauf zu, erhälst aber das selbe Ergebnis - mit weitaus geringerem Risiko.

                ich will doch nur aus zwei dateien eine datei machen, die perl und php gleichzeitig schnallen.

                Perl, PHP, Java, VB und jede andere Sprache haben eins gemein: Man sollte es tunlichst vermeiden, in einem String stehenden Code direkt auszuführen, solange man *innerhalb des Scriptes* nicht *exakt* weiß, wie der Code aussieht. Stammt er von irgendwo sonst - sei es eine Usereingabe oder auch eine Datei - sollte man die Finger von sowas lassen.

                die darin verwendeten veriablennamen existieren ja schon im skript,

                Dann passe es an. Sollte nicht so schwer sein.

                deshalb ist es mir nicht möglich nun $temp{'blah'} für $blah zu schreiben.

                Textpad:
                F8 "$blah" Tab "$temp{'blah'}" Alt+A

                zumindest ist dann der aufwand höher als der nutzen...

                Nein. Der Aufwand ist höher, aber nicht als der Nutzen. Wenn Du das erst durch massive Datenverluste lernen willst, kann ich Dich natürlich nicht dran hindern... :-)

                har har! no risk no fun! :)

                Hieß das nicht "no RISC no fun"? ;-)

                Cheatah

                1. ok, ok.

                  ich geb mich ja geschlagen. ;)
                  leider sind es nun weitaus mehr dateien als _eine_, deshalb doch auch die "zentrale" variablendatei.
                  ultraedit hilft mir da sicher weiter ;) (geiles teil übrigens).

                  trotzdessen war es für mich interessant, herauszufinden, welche möglichkeiten es noch gibt...

                  let's rok°!