如何在perl中删除ls后的换行符?

时间:2015-03-31 02:18:08

标签: perl newline

我在cygwin下使用perl。这就是我想要做的。我想将目录下的所有文件夹列入数组,然后将其作为字符串打印出来,以便得到以下结果。

让工作路径为/user/ 路径中的文件夹是:

/user/A
/user/B
/user/C

我想:

perl foo
/user/A /user/B /user/C

我有以下代码:

my @folderList = `ls /user`;
foreach (@folderList) {
    print "$_ ";
}
print "\n";

,结果是:

$ perl foo
/user/A
/user/B
/user/C
$

我的问题
如何删除存储在数组中的每个结果的换行符?我已经尝试使用chop()删除最后一个char,但它无效。

3 个答案:

答案 0 :(得分:4)

简单的答案是使用chomp来删除$string@strings的新行。

但是你的实现有一些问题。最大的问题是使用像catls这样的系统命令来完成Perl已经可以做的事情。你应该尽可能避免使用系统命令,因为它通常较慢(实际上命令通常比Perl快,但运行它们的工作开销较慢),不可移植(如果你没有Cygwin你的代码赢了'在Windows上运行,不安全(用户很容易将shell代码注入你认为只是文件名),更难以进行错误检查(你需要刮掉STDERR输出而不是读$!),并且你永远不知道你是否得到了BSD或GNU版本(像find这样的特殊问题)。

而是使用opendirreaddiropen等函数来读取文件和目录。

更好的是,使用Path::Tiny模块来处理大多数文件操作。它还负责检查错误,到处都没有or die $!

use v5.10;
use strict;
use warnings;
use Path::Tiny;

my $dir = path("/user");

for my $subdir ($dir->children) {
    say $subdir->absolute;
}

答案 1 :(得分:2)

chomp是要走的路 - 你可以这样做:

my @folderList = `find user -mindepth 1`;

foreach (@folderList) {
    chomp $_;
    print "$_ ";
}
print "\n";

注意:您可能希望将“find user -mindepth 1”更改为符合您需求的unix命令

答案 2 :(得分:1)

如果我理解你的目标,

perl -MCwd -le 'print join " ", glob getcwd. "/*"'

或更多规范

use Cwd;
print(join(" ", glob(getcwd() . "/*"), "\n"));

应该编写的程序。这通过使用内置的Perl函数glob和标准库函数Cwd::getcwd来执行目录扫描而不是调用子进程来绕过整个问题。 (根据经验,如果可以在不调用子进程的情况下执行某些操作,应该执行此操作而不调用子进程。您将知道何时遇到此异常规则。)

您可以遍历glob的输出,但使用join代表没有尾随空格。