Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在perl中删除ls之后的换行符?_Perl_Newline - Fatal编程技术网

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

如何在perl中删除ls之后的换行符?,perl,newline,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";

我在
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()删除最后一个字符,但它不起作用。

chomp
是一种方法--您可以执行以下操作:

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

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

注意:如果我正确理解您的目标,您可能希望将“
查找用户-mindepth 1
”更改为适合您需要的unix命令

perl -MCwd -le 'print join " ", glob getcwd. "/*"'
或者更规范地说

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


您可以在
glob
的输出上循环,但使用
join
则意味着没有尾随空格。

简单的答案是使用它将从
$string
@strings
中删除换行符

但是您的实现有一些问题。最大的问题是使用系统命令,如
cat
ls
来完成Perl已经可以完成的事情。如果可能,您应该避免使用系统命令,因为它通常比较慢(实际上,命令通常比Perl快,但是运行它们的工作开销比较慢)、不可移植(如果没有Cygwin,您的代码将无法在Windows上运行)、不安全(用户很容易将shell代码插入到您认为只是文件名的文件中),错误检查也很难(您需要刮取STDERR输出,而不是读取
$!
),而且您永远不知道是否得到了BSD或GNU版本(查找之类的特殊问题)

而是使用诸如和之类的函数来读取文件和目录

更好的方法是,使用该模块,它可以为您处理大多数文件操作。它还可以检查错误,无
或die$!
随处可见

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

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

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

很抱歉,我修复了代码。因为我原来的函数有点复杂,所以我只需要找出其中的一部分,这样我就可以更容易地一步一步地解决问题~“~好的,那么……如果我在循环中的
chop;
中,紧靠
print”$\"
,你的代码对我有效。我已经给出了一个答案,说明你应该写些什么,但我想知道为什么
chop
对你无效。你到底是如何使用它的?@zwol
chop
将删除字符串中的最后一个字符,不管它是什么。除了明显的问题之外,Windows u为换行符添加两个字符,因此不可移植。我不确定Cygwin命令使用的是什么,可能是单字符Unix换行符。@Schwern我知道这一点-我通常不会使用
chop
,但OP说他们尝试了这种方法。
\r\n
被截断为
\r
的可能性,然后它本身就起到了一种作用但是,我没有想到行终止符。我相信你的意思是
-maxdepth
。如果你要使用
$\uucode>(而且你不应该,你应该使用
foreach my$dir
),您也可以利用这个机会编写
chomp;
print;
。或者干脆
chomp@folderList
,把它从循环中解放出来。@Schwern--很酷!谢谢您的提示:)