我想将一个哈希引用作为参数从一个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";
}
我无法找出传递参考的正确方法。
答案 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";
}
a = Harsha