在Linux上从PHP发送参数到Perl

时间:2015-06-16 05:44:05

标签: php perl encoding shell-exec

我正在尝试使用shell_exec()在远程(当前虚拟)Linux服务器上运行Perl脚本。 Perl文件需要3个参数,文件名,编码和文件内容。

将特定行写入其他人制作的Perl文件中。

脚本应使用arg[0]中的文件名打开文件,文件名在arg[1]中,并在arg[2]中写入内容。

我设法让它工作,因为它将内容写入文件,但由于这个程序写入编码很重要的文件,我将不得不用最初的相同编码来编写它们,因为我们使用重音字符,我需要确保它们也能正常工作。我怎么能这样做?

如果需要,我会添加代码。

编辑:代码:

的Perl:

#!/usr/bin/perl -w

use warnings;
#use strict;

my $fileName = "";
my $contents = "";
my $encoding = "";

if(@ARGV != 3){
    print "use: documentor_write_file fileName encoding contents";
    exit;
}else{

    $fileName = $ARGV[0];
    $encoding = $ARGV[1];
    $contents = $ARGV[2];

}

sub write_file{

    open(DATA,"> :encoding($encoding)",$fileName);
    $contents =~ s/&/&/g;

    $contents =~ s/$/$/g;

    $contents =~ s/&lt;/</g;

    $contents =~ s/&gt;/>/g;

    $contents =~ s/\\&quot;/\"/g;

    $contents =~ s/&cent;/¢/g;
    $contents =~ s/&pound;/£/g;
    $contents =~ s/&yen;/¥/g;
    $contents =~ s/&euro;/€/g;
    $contents =~ s/&copy;/©/g;
    $contents =~ s/&reg;/®/g;

    print(DATA);

    print DATA $contents;

}

write_file;

close(DATA);
exit;

PHP:

if(isset($_GET['stf'])){
    $ret = "";

    $fn = $_POST['fn'];     //File name
    $enc = $_POST['enc'];       //Encoding
    $cont = $_POST['content'];  //Content

    $cont = str_replace("\"","\\\"", $cont);    //Replaces " with \"
    $cont = pg_escape_string($cont);        //
    $cont = htmlspecialchars(htmlentities($cont));  //
    $cont = str_replace("$", "&dollar;", $cont);    //replaces $ with &dollar;

    $cmd2 = "perl /documentor_write_file.pl $fn $enc " . "\"" . $cont . "\"";
    $ret = shell_exec($cmd2);
    //print($ret . " - " . $cmd2);
}

示例:

文件内容:(Perl文件)

#!/usr/bin/perl -w

BEGIN{push @INC,"/usr/local/dpdregister/processes/common/";}
eval {require 'dpdregister.conf'; use vars qw ( $dbh ) };

=history
<HIST>
history2 áéűáé
több history
</HIST>
=cut

它实际写入文件的内容:

#!/usr/bin/perl -w

BEGIN{push @INC,\&amp;quot;/usr/local/dpdregister/processes/common/\&amp;quot;;}
eval {require ''dpdregister.conf''; use vars qw ( &dollar;dbh ) };

=history
&amp;lt;HIST&amp;gt;
history2 &amp;aacute;&amp;eacute;\x{00c5}\x{00b1}&amp;aacute;&amp;eacute;
t&amp;ouml;bb history

&amp;lt;/HIST&amp;gt;
=cut

1 个答案:

答案 0 :(得分:0)

以UTF-8编写所有内容会不会更容易?

需要将所有这些Perl文件一次性转换为UTF-8(如果需要,也可以在Perl中完成;只是不要忘记设置use utf8;编译指示),但之后您只需要检查发送到文件的内容实际上是UTF-8。