0

当我使用系统运行我的 perl 程序时,出现以下错误。

> system("perl txt2xlsx.pl", intern=TRUE, wait=TRUE)
character(0)
attr(,"status")
[1] 2
Warning message:
running command 'perl txt2xlsx.pl' had status 2 

但是,当我从终端/控制台运行脚本时,它工作得非常好。出于测试目的,我将另一个仅将“输出”打印到屏幕的 perl 脚本放入同一目录并运行它:

> system("perl test.pl",     intern=TRUE, wait=TRUE)

[1] “输出”

工作正常。

当您不带任何参数运行我的 txt2xlsx.pl 脚本时,它会打印:

Usage: txt2xlsx.pl <directory> <output file>

谁能想象为什么 R 返回这个错误?在我更新到最新的 perl 版本之前它运行良好:

This is perl 5, version 12, subversion 4 (v5.12.4) built for darwin-multi-2level

干杯

这是我的一些 perl 脚本:

#!/usr/bin/perl

use Excel::Writer::XLSX;

# Check command line args
if($#ARGV != 1) {
     die("Usage: $0 <directory> <output file>\n\n");
}

my $dir = $ARGV[0];
my $output = $ARGV[1];

print "Output    : $output\n";
print "Directory : $dir\n";

# Create excel workbook
my $wb = Excel::Writer::XLSX->new($output);

# Process files
foreach (glob("$dir/*.txt")) {

....

}
#EOF

我做了一些更多的测试并减少了 perl 脚本以仅打印两个参数:

#!/usr/bin/perl

#use Excel::Writer::XLSX;

# Check command line args
if($#ARGV != 1) {
     die("Usage: $0 <directory> <output file>\n\n");
}

my $dir = $ARGV[0];
my $output = $ARGV[1];

print "Output    : $output\n";
print "Directory : $dir\n";

当我使用它的两个预期参数调用程序时,系统工作:

> system("perl test.pl asd dasd", intern=TRUE, wait=TRUE)
[1] "Output    : dasd" "Directory : asd" 

没有它会产生相同的错误消息:

> system("perl test.pl", intern=TRUE, wait=TRUE)
character(0)
attr(,"status")
[1] 255
Warning message:
running command 'perl test.pl asd dasd' had status 255

我注意到当我使用失败评论#use Excel::Writer::XLSX;系统调用时:system

> system("perl test.pl asd dasd", intern=TRUE, wait=TRUE)
character(0)
attr(,"status")
[1] 2
Warning message:
running command 'perl test.pl asd dasd' had status 2

所以看起来它不喜欢 XLSX perl 模块。但是,正如我已经提到的,在终端中运行脚本绝对可以。它还与更新前的 R 系统调用一起工作......

--------------------

我正在使用 StatET 和 Eclipse,并尝试在普通 R 版本中运行它。那里的错误信息更加清晰。当我通过 R 调用 perl 调用时,perl 找不到代码中使用的 XLSX 包:

> system("perl test.pl asd asd", intern=TRUE, wait=TRUE)
character(0)
attr(,"status")
[1] 2
Warning message:
running command 'perl test.pl asd asd' had status 2 
Can't locate Excel/Writer/XLSX.pm in @INC (@INC contains: /Library/Perl/5.12/darwin- 
thread-multi-2level /Library/Perl/5.12 /Network/Library/Perl/5.12/darwin-thread-multi-
2level /Network/Library/Perl/5.12 /Library/Perl/Updates/5.12.4 
/System/Library/Perl/5.12/darwin-thread-multi-2level /System/Library/Perl/5.12 
/System/Library/Perl/Extras/5.12/darwin-thread-multi-2level 
/System/Library/Perl/Extras/5.12 .) at test.pl line 3.
BEGIN failed--compilation aborted at test.pl line 3.

有人知道如何解决吗?

4

3 回答 3

1

我怀疑您的 perl 脚本实际上确实返回了退出代码 2,这是一个非标准值,意在发出信号。

正是因为通过 via 进行通信system()非常乏味,您可以考虑在 R 本身中执行此操作。如果源文件是ascii,则很容易阅读。并且包XLConnectxlsx允许您在 R 支持的任何平台上用 xlsx 编写(并且支持 Java,因为 xlsx 读/写代码来自 Java jar 文件库)。

于 2012-07-30T13:23:39.893 回答
0

当您在终端中运行程序时,您将设置一些环境变量集(如 PERL5LIB),在通过 R 运行时会丢失这些变量集,并且是指示 perl 查找 Excel::Writer::XLSX 的那个。

运行env | grep PERL找出哪个

然后您可以导出它,或将所需的值传递给 -I 参数。

于 2014-06-17T09:05:43.653 回答
0

您的 perl 文件需要命令行上的参数。它应该像这样执行:

perl txt2xlsx.pl dir_to_outputfile outputfile.xls

尝试将您的 R 文件更改为

system("perl txt2xlsx.pl dir_to_outputfile output.xls", intern=TRUE, wait=TRUE)
于 2012-07-30T13:31:41.280 回答