如何在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
对你无效。你到底是如何使用它的?@zwolchop
将删除字符串中的最后一个字符,不管它是什么。除了明显的问题之外,Windows u为换行符添加两个字符,因此不可移植。我不确定Cygwin命令使用的是什么,可能是单字符Unix换行符。@Schwern我知道这一点-我通常不会使用chop
,但OP说他们尝试了这种方法。\r\n
被截断为\r
的可能性,然后它本身就起到了一种作用但是,我没有想到行终止符。我相信你的意思是-maxdepth
。如果你要使用$\uucode>(而且你不应该,你应该使用foreach my$dir
),您也可以利用这个机会编写chomp;
和print;
。或者干脆chomp@folderList
,把它从循环中解放出来。@Schwern--很酷!谢谢您的提示:)