Perl系统+拆分+数组

时间:2012-07-25 04:09:41

标签: perl split

我的名字是路易斯,住在arg。 我有一个问题,无法解决。

**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 个答案:

答案 0 :(得分:6)

您看到的输出不是来自print语句,而是ls的控制台输出。要将ls输出转换为变量,请使用反引号:

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

这是因为exec没有返回,后面的语句没有被执行。来自perldoc

  

exec函数执行系统命令,永不返回;使用   如果你想要它返回,系统而不是exec。它失败并返回   仅当命令不存在且直接执行时才为false   而不是通过系统的命令shell

但是使用system命令对你没有帮助,因为它不允许输出捕获,因此,反引号。但是,使用glob函数更好:

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

此外,perl数组索引从0开始,而不是1.要获取file1.pl,您应该使用print "$lsarray[0]\n"

答案 1 :(得分:3)

当您在Perl中编写内容时,使用shell是不好的做法。

此程序显示我认为您想要的内容。

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

修改

我刚刚从perreal的帖子中了解了你需要的东西。

要显示当前工作目录中的第一个文件,只需写入

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

答案 2 :(得分:0)

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

(尽管如果脚本会做更多的事情,通常应该避免在标量上下文中使用迭代器。)