如何在 perl 中删除 ls 后的换行符?
How to remove newline after ls within perl?
我在 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";
注意:您可能希望将“find user -mindepth 1
”更改为适合您需要的 unix 命令
如果我正确理解你的目标,
perl -MCwd -le 'print join " ", glob getcwd. "/*"'
或更规范
use Cwd;
print(join(" ", glob(getcwd() . "/*"), "\n"));
是您应该编写的程序。这通过使用内置的 Perl 函数 glob
and the standard library function Cwd::getcwd
进行目录扫描而不是调用子进程来绕过整个问题。 (根据经验,如果你 可以 做某事而不调用子进程,你 应该 不调用子进程就做。你会知道什么时候你遇到了这条规则的例外情况。)
您可以遍历 glob
的输出,但是使用 join
意味着没有尾随 space.
简单的答案是使用 chomp
,它将去除 $string
或 @strings
.
的换行符
但是你的实现有一些问题。最大的是使用像 cat
和 ls
这样的系统命令来做 Perl 已经可以做的事情。您应该尽可能避免使用系统命令,因为它通常较慢(实际上命令通常比 Perl 快,但对 运行 进行工作的开销较慢),不可移植(如果您没有 Cygwin您的代码将无法在 Windows 上运行),不安全(用户很容易将 shell 代码注入您认为只是文件名的内容),更难进行错误检查(您需要抓取STDERR 输出而不是读取 $!
),并且您永远不知道您获得的是 BSD 还是 GNU 版本(查找之类的特定问题)。
而是使用 opendir
, readdir
, and open
等函数来读取文件和目录。
更好的是,使用 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;
}
我在 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";
注意:您可能希望将“find user -mindepth 1
”更改为适合您需要的 unix 命令
如果我正确理解你的目标,
perl -MCwd -le 'print join " ", glob getcwd. "/*"'
或更规范
use Cwd;
print(join(" ", glob(getcwd() . "/*"), "\n"));
是您应该编写的程序。这通过使用内置的 Perl 函数 glob
and the standard library function Cwd::getcwd
进行目录扫描而不是调用子进程来绕过整个问题。 (根据经验,如果你 可以 做某事而不调用子进程,你 应该 不调用子进程就做。你会知道什么时候你遇到了这条规则的例外情况。)
您可以遍历 glob
的输出,但是使用 join
意味着没有尾随 space.
简单的答案是使用 chomp
,它将去除 $string
或 @strings
.
但是你的实现有一些问题。最大的是使用像 cat
和 ls
这样的系统命令来做 Perl 已经可以做的事情。您应该尽可能避免使用系统命令,因为它通常较慢(实际上命令通常比 Perl 快,但对 运行 进行工作的开销较慢),不可移植(如果您没有 Cygwin您的代码将无法在 Windows 上运行),不安全(用户很容易将 shell 代码注入您认为只是文件名的内容),更难进行错误检查(您需要抓取STDERR 输出而不是读取 $!
),并且您永远不知道您获得的是 BSD 还是 GNU 版本(查找之类的特定问题)。
而是使用 opendir
, readdir
, and open
等函数来读取文件和目录。
更好的是,使用 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;
}