0

system を使用して 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 スクリプトを縮小して 2 つの引数のみを出力しました。

#!/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";

予想される 2 つの引数を使用してプログラムを呼び出すと、システムは機能します。

> 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 を返しているのではないかと思います。これは、何かを通知するための非標準値です。

経由での通信system()は非常に面倒なので、R 自体でこれを行うことを検討できます。ソースファイルがアスキーなら読みやすいです。また、パッケージXLConnectおよびxlsxを使用すると、R がサポートする任意のプラットフォームで xlsx を書き込むことができます (また、xlsx の読み取り/書き込みコードは Java jar ファイル ライブラリから取得されるため、Java をサポートします)。

于 2012-07-30T13:23:39.893 に答える
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 に答える
0

ターミナルでプログラムを実行すると、R を介して実行したときに欠落し、Perl に Excel::Writer::XLSX を見つけるように指示する環境変数セット (PERL5LIB など) があります。

実行env | grep PERLして、どれを見つけますか

次に、それをエクスポートするか、必要な値を -I パラメーターに渡します。

于 2014-06-17T09:05:43.653 に答える