如何从Web传递信息到perl脚本?

时间:2015-10-03 00:03:13

标签: javascript perl shell cgi

我想使用java脚本调用perl script,并传递一个java脚本变量?此脚本已由其他人编写。我只想在一些文本上使用他们的脚本然后在我的网站上输出结果。问题是脚本需要一个文件作为输入。

perl脚本具有以下用法

Cannot call method 'forEach' of undefined

我想在调用此脚本时传入一个文本框,并将打印到控制台的命令返回到我的javascript函数。

latexindent.pl [options] [file][.tex]

2 个答案:

答案 0 :(得分:1)

你提到CGI是一个标签,所以我假设你没有使用node.js,在这种情况下你会看到

这样的东西。
var exec = require('child_process').exec;
var cmd = 'prince -v builds/pdf/book.html -o builds/pdf/book.pdf';

exec(cmd, function(error, stdout, stderr) {
// command output is in stdout
});

因此,假设您希望在服务器上运行perl作为Web服务器执行的CGI,那么Dinesh指出您有2个选项。

选项1:

编辑文件以充当CGI,并通过配置CGI处理程序等使其可通过Web服务器访问。

基本上你需要: 包括CGI.pm,提取已发布的参数并使用它们代替文件内容。这些方面的东西应该让你开始。

#!/usr/bin/perl

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

my $cgi = CGI::Carp->new();
my $data = from_json( $cgi->param('mode') ); ## prob need to tweak 

## now continue with your processing using $data instead of the file content.

开放2:   创建一个perl CGI或配置您的Web服务器以处理请求和执行您现有的脚本。

使用类似的代码,但执行使用system(),exec或``approach。请务必阅读有关捕获输出和注入安全问题可能性的安全问题和这些调用方法之间的差异。

答案 1 :(得分:0)

Dinesh Patra的评论帮助我得出答案: 创建一个包装器方法来创建一个文件,然后用创建的文件执行脚本。无需对perl脚本进行任何更改。 这是我用最通用的方式做的。下面的解释。

Javascript:

    function sendValueOne(textToSend) {
        $.post("path/to/php/Wraper.php", {text: textToSend},
        function (data) {
            $('#id').html(data.result);
        }, "json");
    }

PHP:

$value = $_POST['text'];       //Get text from post
$uniqueid  = getGUID();      //Create Guid (unique identifier)
//Write file to server.
$file = fopen("$uniqueid.tex", "w") or die("Unable to open file!");
fwrite($file, $value);
fclose($file);

//Execute the script passing the file
$result = shell_exec("perl perl path/to/perl/script.pl $uniqueid.tex");

//Delete the file
unlink("$uniqueid.tex");

//Return result
$response = new STDclass();
$response->result = "$result";
echo json_encode($response);

//Function found online to create guid
function getGUID(){
    if (function_exists('com_create_guid') === true){
        return trim(com_create_guid(), '{}');
    }
return sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));
}
  1. 您希望使用javascript将要输入脚本的文本发送到php。
  2.  $.post("path/to/php/Wraper.php", {text: textToSend},
            function (data) {
                $('#id').html(data.result);
            }, "json");
    
    1. 创建一个GUID,一个文件的唯一标识符,以便我们可以删除该文件。我使用了一个找到online.
    2. 的函数
      $uniqueid  = getGUID(); 
      
      1. 使用guid创建文件。
      2. $file = fopen("$uniqueid.tex", "w") or die("Unable to open file!");
        fwrite($file, $value);
        fclose($file);
        
        1. 执行perl脚本并将输出保存到变量
        2. $result = shell_exec("perl perl path/to/perl/script.pl $uniqueid.tex");
          
          1. 现在删除文件并对输出进行json编码并将其返回给java脚本。
          2. //Delete the file
            unlink("$uniqueid.tex");
            
            //Return result
            $response = new STDclass();
            $response->result = "$result";
            echo json_encode($response);
            
            1. 最后,我们将结果返回到我们的网站,并可以随心所欲地完成任务。
            2.   $.post("path/to/php/Wraper.php", {text: textToSend},
                    function (data) {
                        $('#id').html(data.result); //Do something with result.
                    }, "json");