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:
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":
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
     }