Perl系统+分割+数组

问题描述:

我的名字是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

您看到的输出不是来自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

当你可以在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

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

(虽然使用标量上下文中的迭代器通常应避免如果脚本将进一步做任何事情。)