【问题标题】:Perl system + split + arrayPerl 系统 + 拆分 + 数组
【发布时间】:2012-07-25 04:09:40
【问题描述】:

我叫 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.

【问题讨论】:

  • 如果你要use warnings,perl 会警告你exec() 之后的任何内容都不会被执行。 ("声明不太可能在...达成")

标签: perl split


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    编辑

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

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

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

    【讨论】:

      【解决方案3】:
      print <*> // die("No file found\n"), "\n";
      

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

      【讨论】:

        猜你喜欢
        • 2014-06-21
        • 1970-01-01
        • 1970-01-01
        • 2014-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多