将散列引用作为参数传递给perl脚本中的perl脚本

时间:2015-07-17 09:34:30

标签: perl hash reference

我想将一个哈希引用作为参数从一个perl脚本(script1.pl)传递给另一个perl脚本(script2.pl)。这就是我的代码的样子:

---------------------------- script1.pl ---------------- -----------------

<?php
@author: Winston Hope
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="merged.xls"');
header('Cache-Control: max-age=0');

//error_reporting(E_ALL);
set_time_limit(0);
date_default_timezone_set('America/Belize');

set_include_path('Classes/');
include 'PHPExcel/IOFactory.php';

$inputFileName = 'hub-project-assignment-Example.xlsx';
$inputFileName2 = 'hub-project-assignment-Example-2.xlsx';

$files = array();
$files[] = 'hub-project-assignment-Example.xlsx';
$files[] = 'hub-project-assignment-Example-2.xlsx';
$files[] = 'hub-project-assignment-Example-3.xlsx';
$files[] = 'hub-project-assignment-Example-4.xlsx';
$files[] = 'hub-project-assignment-Example-5.xlsx';

$objPHPExcel = PHPExcel_IOFactory::load($files[0]);
$sheetData = $objPHPExcel->getSheet(0)->toArray(null,true,true,true);
$firstSheetSize = count($sheetData);
$index = $firstSheetSize;
$activeFirstSheet = $objPHPExcel->getSheet(0);
unset($files[0]);
$total = $firstSheetSize;

foreach($files as $file) {

    $objPHPExcel2 = PHPExcel_IOFactory::load($file);
    $sheetData2 = $objPHPExcel2->getSheet(0)->toArray(null,true,true,true);

    $secondSheetSize = count($sheetData2);
    $total += $secondSheetSize-1;
    $pos = 2;

    for(; $index<$total; $index++) {
        $row = $sheetData2[$pos];
        foreach($row as $letter => $value) {
            $cell =  $letter.($index+1);
            $activeFirstSheet->setCellValue($cell, $value);
        }
        $pos++;
    }
}

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output'); 

---------------------------- script2.pl ---------------- -----------------

#!/usr/bin/perl -w

use strict;
use warnings;

my %hash = (
'a'      => "Harsha",
'b'      => "Manager"
);

my $ref = \%hash;

system "perl script2.pl $ref";

这是输出错误:

#!/usr/bin/perl -w

use strict;
use warnings;

my %hash = %{$ARGV[0]};

my $string = "a";

if (exists($hash{$string})){
    print "$string = $hash{$string}\n";
}

我无法找出传递参考的正确方法。

4 个答案:

答案 0 :(得分:8)

哈希是一种内存数据结构。流程&#39;拥有&#39;他们自己的内存空间,其他进程无法访问它。如果你考虑一下,我相信你会很快发现原因。

哈希引用是该内存位置的地址。即使其他过程能够理解&#39;它,它仍然无法访问存储空间。

我们在这里谈论的实际上是一个非常大的概念 - 进程间通信或IPC - 因此有关于它的整个文档章节,称为perlipc

它的长短是 - 你无法做你想做的事。在进程之间共享内存比你想象的要困难得多。

您可以做的是来回传输数据 - 不是通过引用,而是包含实际信息。

我建议你的例子,这个工作的工具是JSON,因为那时你可以对你的哈希进行编码和解码:

#!/usr/bin/perl -w

use strict;
use warnings;

use JSON;

my %hash = (
    'a' => "Harsha",
    'b' => "Manager"
);

my $json_string = to_json( \%hash );

print $json_string;

这给出了:

{"b":"Manager","a":"Harsha"}

然后你可以通过&#39;你的$json_string - 在命令行上,但请记住,如果你不小心,或者通过@ARGV,其中的任何空格都会混淆STDIN

然后在您的子流程中解码:

use strict;
use warnings;

use JSON;

my $json_string = '{"b":"Manager","a":"Harsha"}';

my $json = from_json ( $json_string );

my $string = "a";

if (exists($json -> {$string} )){
    print "$string = ",$json -> {$string},"\n";
}

(您可以通过以下方式使其与代码更相似:

my $json = from_json ( $json_string );
my %hash = %$json;

其他选择是:

  • 使用Storable - 冷冻和解冻(内存)或存储和检索(磁盘)
  • 使用IPC::Open2并在STDIN上发送数据。

确实有多种选择 - 请查看perlipc。但这不是一件简单的事情,而只是传递一个参考文献&#39;不幸。

答案 1 :(得分:1)

使用Storable在第一个脚本中存储数据并从其他脚本中检索数据。

firstscript.pl

my $parentpid = shift;
my $ref = retrieve("/home/chankey/secondscript.$parentpid") or die "couldn't retrieve";
print Dumper $ref;

secondscript.pl

{
  "error":"invalid_client",
  "error_description":"A valid client ID must be provided along with any request made to Vimeo's API"
}

您已收到$ ref中的%哈希值。现在按照你想要的方式使用它。

答案 2 :(得分:0)

您无法将引用从一个脚本传递到另一个脚本 - 该引用仅在当前运行的perl实例中具有意义。

您需要在第一个脚本中“序列化”数据,然后在第二个脚本中“反序列化”。

答案 3 :(得分:-2)

你调用perl文件的方式是错误的。 只需改变调用它的方式就可以了。

Script1.pl
---------------------------------

#!/usr/bin/perl -w

use strict;
use warnings;

my %hash = (
    'a'      => "Harsha",
    'b'      => "Manager"
);

system("perl","script2.pl",%hash);

在另一个perl脚本中使用此%hash,如下所示。

Script2.pl
----------------------------------

#!/usr/bin/perl -w

use strict;
use warnings;

my %hash = @ARGV;

my $string = "a";

if (exists($hash{$string})){
    print "$string = $hash{$string}\n";
}

OutPut

a = Harsha