2010-05-10 56 views
1

說我有這樣的Perl 「程序」 稱爲simple.pl:Perl的 '系統' 失敗消息

#!/usr/bin/perl 
use xyz; # xyz is bogus and doesn't exist 

而且我也有這樣的 「程序」,叫simple2.pl:

#!/usr/bin/perl 
system("simple.pl"); 

my $abc = `simple.pl`; 
printf("abc %s\n", $abc); 

對於系統和反向撥號,我收到此消息:

Can't exec "simple.pl": No such file or directory at scripts/perl/simple2.pl line 7. 
Can't exec "simple.pl": No such file or directory at scripts/perl/simple2.pl line 9. 

對用戶調用simple2.pl不是很有用。有沒有辦法獲得更有用的信息?

注意。 simple.pl確實存在於當前目錄中。真正的問題是simple.pl不能編譯。 simple2迴應說簡單不存在。這是一個誤導消息。

如果我有辦法甚至捕獲將成爲開始的編譯消息。

回答

3

是的,檢查文件是否存在並且是可執行的,如果不存在,則打印更多的描述性消息。

unless (-ex $filename) { 
    print "I am unable to execute file $filename."; 
} 
+0

該程序確實存在。問題是簡單的不編譯,但消息說別的東西。 – mmccoo 2010-05-10 22:39:34

+0

nix那。我是白癡 – mmccoo 2010-05-10 22:45:07

+0

@ mmc:你可以刪除無效的註釋:點擊你的名字和時間戳右側出現的紅色的x。 – Ether 2010-05-11 00:17:16

6

這意味着系統在PATH上找不到名爲「simple.pl」的可執行文件。如果您的simple.pl位於當前目錄中,您可以嘗試將「simple.pl」更改爲「./simple.pl」。

其實,我看不出如何使這個信息更具描述性。如果你是perl,你會如何報告這個錯誤?

BTW,我不會嘗試從simple2.pl :)

+0

+1。另外我覺得有趣的是認爲編程語言負責提供用戶友好的錯誤消息。 – tster 2010-05-10 22:18:41

+0

simple.pl確實存在。問題是它不能編譯。我得到的消息並沒有說它不能編譯,而是程序不存在。誤導。 好的。 simple2應該調用簡單的 – mmccoo 2010-05-10 22:38:52

+1

nix我的評論。我是一個白癡 – mmccoo 2010-05-10 22:44:41

1

爲使warnings編譯獎勵積分的內部運行的「simple2.pl」!有一個upvote!

您想使用反引號或qx//來捕獲外部程序的輸出,而不是system。要替換自己的錯誤消息,這將是有意義的用戶(多點你!),那麼你可以做一些事情,如

#! /usr/bin/perl 

use strict; 
use warnings; 
no warnings 'exec'; 

chomp(my $abc = `simple2.pl`); 
if ($? == 0) { 
    printf("abc %s\n", $abc); 
} 
else { 
    die "$0: unable to calculate abc\n"; 
} 

在你不熟悉的情況下,$?

$ CHILD_ERROR
$?
最後一個管道關閉,倒退命令,成功調用waitwaitpid或從system運算符返回的狀態。

$?爲零時,表示成功。如果你想執行的東西,你知道是

sub calculate_abc { 
    no warnings 'exec'; 

    # ... 
} 
1

記住warnings編譯的詞彙,因此而不是禁止對整個程序的警告,你可能只是一個子做Perl腳本,爲什麼不直接調用解釋器而不是處理知道如何執行文件的系統?

my $file = 'simple.pl'; 

-e $file or die "file '$file' not found"; 

system "perl $file"; 
# or 
print `perl $file`; 

在同一安裝運行的當前腳本的Perl的運行:

system "$^X $file"; # or `$^X $file` 

$^X是一個特殊的Perl變量,它包含運行解釋的文件名。

2

如果perl說它無法找到該文件,那麼它無法找到該文件。而問題更多的是你的代碼。看看這個例子。

 
[email protected]:~/perl$ cat test.pl 
#!/usr/bin/env perl 
use strict; 
use warnings; 
use xyz; 
[email protected]:~/perl$ cat test2.pl 
#!/usr/bin/env perl 
use strict; 
use warnings; 
system('test.pl'); 
[email protected]:~/perl$ cat test3.pl 
#!/usr/bin/env perl 
use strict; 
use warnings; 
system('./test.pl'); 

如果執行test2.pl你:

 
[email protected]:~/perl$ ./test2.pl 
Can't exec "test.pl": No such file or directory at ./test2.pl line 4. 

如果執行test3.pl你:

 
[email protected]:~/perl$ ./test3.pl 
Can't locate xyz.pm in @INC (@INC contains: /home/sidburn/perl510/lib/5.10.1/i686-linux /home/sidburn/perl510/lib/5.10.1 /home/sidburn/perl510/lib/site_perl/5.10.1/i686-linux /home/sidburn/perl510/lib/site_perl/5.10.1 .) at ./test.pl line 4. 
BEGIN failed--compilation aborted at ./test.pl line 4. 

如果不提供相對或絕對路徑然後perl在$ PATH環境變量中查找命令。如果不存在,則無法找到該文件。

如果它在當前目錄中,則需要提供「./」。但是請注意「當前目錄」並不意味着腳本依賴的目錄。

如果你想以後的,那麼你可能想要做一個

 
use FindBin; 

有了這個,你可以做這樣的事情:

 
#!/usr/bin/env perl 
use strict; 
use warnings; 
use FindBin; 
use File::Spec::Functions; 

my $exe = catfile($FindBin::RealBin, 'test.pl'); 

print $exe, "\n"; 
system($exe); 
如果你想檢查系統正確地返回

,你需要檢查system()命令或$?的返回值後來持有這個價值。

 
if ($? != 0) { 
    die "Cannot execute $exe.\n"; 
} 

如果要禁止從你的程序,你需要與系統啓動程序前重定向STDOUT,STDERR消息()。

或者使用類似IPC::System::Simple 或IPC :: Open3(在覈心中)。

0

我有完全相同的問題,並發現perl沒有安裝。所以bash腳本試圖在沒有解釋器的情況下執行perl。

ls /usr/bin/perl