2012-07-25 77 views
2

我的名字是luis,住在arg。 我有一個問題,無法解決。Perl系統+分割+數組

**IN BASH** 
pwd 
/home/labs-perl 
ls 
file1.pl file2.pl 

**IN PERL** 
my $ls = exec("ls"); 
my @lsarray = split(/\s+/, $ls); 
print "$lsarray[1]\n"; #how this, i need the solution. >> file.pl 
file1.pl file2.pl # but this is see in shell. 
+3

如果你使用'warnings',perl會警告你'exec()'後面什麼都不會執行。 (*「聲明不太可能達到......」*) – pilcrow 2012-07-25 04:24:31

回答

6

您看到的輸出不是來自print語句,它是ls的控制檯輸出。爲了讓ls輸出到一個變量,使用反引號:

my $ls = `ls`; 
my @lsarray = split(/\s+/, $ls); 
print "$lsarray[1]\n"; 

這是因爲exec不回,不執行之後的語句。從perldoc

exec函數執行一個系統命令,永不返回;如果您希望它返回,請使用 系統而不是exec。它失敗並返回 假只有當命令不存在,它是直接 ,而不是通過系統的命令shell

執行,但使用system命令不會幫助你,因爲它不允許輸出捕獲,因此,反引號。但是,使用glob功能更好:

my @arr = glob("*"); 
print $arr[1], "\n"; 

此外,Perl數組索引從0開始,而不是1。要獲得file1.pl你應該使用print "$lsarray[0]\n"

+0

哇,謝謝你的回答。這是完美的。感謝Borodin – opmeitle 2012-07-25 04:31:13

3

當你可以在Perl中編寫某些東西時使用shell是一種不好的做法。

這個程序顯示我認爲你想要的。

chdir '/home/labs-perl' or die $!; 
my @dir = glob '*'; 
print "@dir\n"; 

編輯

剛纔我更好地理解你從perreal的崗位需要什麼。

要顯示在當前工作目錄中的第一個文件,只寫

print((glob '*')[0], "\n"); 
+0

,可以解決我與你的問題回答。 – opmeitle 2012-07-25 04:42:26

0
print <*> // die("No file found\n"), "\n"; 

(雖然使用標量上下文中的迭代器通常應避免如果腳本將進一步做任何事情。)