2015-03-31 86 views
1

我使用perl根据cygwin。这是我想要做的。我想列出一个目录下的所有文件夹到一个数组中,然后以字符串形式打印出来,以便得到以下结果。如何在perl之后删除ls后的换行符?

让,工作路径是/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()去除最后一个字符,但它不工作。

+0

对不起,我修复了代码。由于我原来的功能有点复杂,所以我只是弄清楚它的一部分,这样我就可以更容易地逐步解决我的问题了〜“〜 – sflee 2015-03-31 02:30:38

+1

好的,所以......如果我把'chop'在循环中,在'print'$ _“;'之前,你的代码适用于我,我已经给出了你应该写的东西的答案,但是我想明白为什么'chop'不适合你。你究竟是怎么使用它的? – zwol 2015-03-31 02:45:11

+0

@zwol'chop'将删除字符串中的最后一个字符,不管它是什么。除了明显的问题,Windows使用两个字符作为换行符,所以它是不可移植的。我不确定Cygwin命令使用什么,可能是单个字符Unix新行。 – Schwern 2015-03-31 03:43:54

回答

4

简单的答案是使用chomp,这将从$string@strings剥去换行符。

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

改为使用opendir,readdiropen等函数来读取文件和目录。

更好的是,使用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

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

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

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

注:你可能要改变“find user -mindepth 1”到适合您需要的unix命令

+0

我相信你的意思是'-maxdepth'。 – zwol 2015-03-31 02:40:02

+0

如果你打算使用'$ _'(并且你不应该,你应该使用'foreach my $ dir'),那么你也可以利用它来写'chomp;'和'print;'。或者只是'chomp @ folderList'并将其从循环中取出。 – Schwern 2015-03-31 03:05:34

+1

@Schwern - 酷!谢谢你的提示 :) – csiu 2015-03-31 03:20:34

1

如果我正确理解你的目标,

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

或更多规范

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

是你写的应该有的程序。这通过使用内置Perl函数glob和标准库函数Cwd::getcwd来绕过整个问题来执行目录扫描,而不是调用子进程。 (作为一个经验法则,如果你可以做一些事情,而不必调用子进程,你应该做没有调用子进程,你会当您遇到此规则的例外知道。)

你可以循环在glob的输出上,但使用join代替表示没有尾随空格。