Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8329[/thread]

Programm aus perl starten und Ausgabe auslesen



<< >> 3 Einträge, 1 Seite
MickiM
 2006-09-13 21:41
#69851 #69851
User since
2006-09-13
1 Artikel
BenutzerIn
[default_avatar]
Hallo erstmal,

ich möchte gerne ein externes Programm aus perl starten und dabei einen Parameter übergeben. Das Problem ist aber, das in den Parametern auch Sonderzeichen wie ^ oder ähnliches vorkommen kann.

Derzeit mache ich das mit open und leite die Ausgabe mit der pipe um, damit ich die Ausgabe des Programmes auslesen kann. Leider klappt das nicht, wenn in meiner Variable Sonderzeichen vorkommen.

Der Start des Programmes mit Sonderzeichen über die Shell klappt problemlos.

Für Tips wäre ich sehr dankbar
MickiM
renee
 2006-09-13 21:47
#69852 #69852
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
probier mal
Code: (dl )
my $return = qx{befehl mit allen parametern};
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Dubu
 2006-09-14 12:41
#69853 #69853
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Deine Kommandozeile, wie du sie in Perl zusammensetzt, wird auch nur an die Shell übergeben. Perlvariablen, die dabei in der Kommandozeile auftauchen, werden natürlich vorher expandiert. Eventuell musst du deine Parameter daher genauso quoten, wie du es in der Shell machst, z.B. mit einfachen Anführungszeichen.
In renees Vorschlag sähe das dann so aus, vorausgesetzt $progname enthält den Pfad/Namen des Programms und $parameter deinen Parameter:
Code: (dl )
my $return = qx{$programm '$argument'};


Komplizierter, aber auch sicherer ist es, wenn man fork & exec benutzt, um den Kindprozess zu starten. Das folgende Beispiel ist aus perlipc, Abschnitt "Using open() for IPC":
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
       Here&’s a safe backtick or pipe open for read:

          # add error processing as above
          $pid = open(KID_TO_READ, "-|");

          if ($pid) {   # parent
              while (<KID_TO_READ>) {
                  # do something interesting
              }
              close(KID_TO_READ) || warn "kid exited $?";

          } else {      # child
              ($EUID, $EGID) = ($UID, $GID); # suid only
              exec($program, @options, @args)
                  || die "can&’t exec program: $!";
              # NOTREACHED
          }
<< >> 3 Einträge, 1 Seite



View all threads created 2006-09-13 21:41.