2

我叫 luis,住在 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.
4

3 回答 3

6

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

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

这是因为exec没有返回,它之后的语句没有被执行。从perldoc

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

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

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

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

于 2012-07-25T04:14:14.333 回答
3

当您可以在 Perl 中编写某些内容时,使用 shell 是一种不好的做法。

这个程序显示了我认为你想要的。

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

编辑

我刚刚从 perreal 的帖子中更好地了解了您的需求。

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

print((glob '*')[0], "\n");
于 2012-07-25T04:17:22.557 回答
0
print <*> // die("No file found\n"), "\n";

(尽管如果脚本要进一步做任何事情,通常应该避免在标量上下文中使用迭代器。)

于 2012-07-25T04:53:43.857 回答