在 perl 中找不到路径
Posted
技术标签:
【中文标题】在 perl 中找不到路径【英文标题】:Path not found in perl 【发布时间】:2021-08-22 08:29:09 【问题描述】:我想获取指定目录中文件所有者的名称(循环中的 2 个仅用于测试,我的 /media 中只有 2 个文件)。因此,如果用户的输入是“/media”,我会得到以下输出:
sh: 2: /kuba: not found sh: 2: /sf_Shared: not found root:kuba
看来,该脚本有效,但仍显示“未找到”。
my $directory =<STDIN>; #"/media";
my @ls = qx(ls $directory);
chomp @ls;
my @fow;
for(my $i = 0; $i < 2; $i++ )
$fow[$i] = qx(stat -c '%U' $directory/$ls[$i]);
#say $fow[$i];
chomp @fow;
print "$fow[0]:$ls[0]\n";
顺便说一句,当我删除用户的输入并将 $directory 声明为“/media”时,它工作得非常好。
【问题讨论】:
你必须chomp$directory
数据。
my $directory =<STDIN>;
会给你/media\n
,不剥离\n
你的操作系统将找不到目录。
使用chomp()
从<STDIN>
读取的数据中删除换行符通常是一个非常好的主意。但在这种情况下,没有必要将字符串(附加换行符)传递给qx(ls $directory)
。执行命令的 shell 并不关心末尾是否有换行符。试试perl -lE '$dir = ".\n"; say qx(ls $dir)'
【参考方案1】:
为什么不使用 perl 指令来代替耗费资源的 shell 调用?
use strict;
use warnings;
my $dir = shift || die "Provide a directory name";
my($file, $owner);
while( glob("$dir/*") )
$file = $_;
$owner = getpwuid((stat($_))[4]);
write;
$~ = 'STDOUT_BOTTOM';
write;
exit 0;
format STDOUT_TOP =
+----------------------------------------------------------+-----------------+
| File | User |
+----------------------------------------------------------+-----------------+
.
format STDOUT =
| @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< | @<<<<<<<<<<<<<< |
$file, $owner
.
format STDOUT_BOTTOM =
+----------------------------------------------------------+-----------------+
.
参考: shift, glob, stat, getpwuid, write, format
【讨论】:
你能在代码中添加更多的 cmets 吗?我昨天第一次开始使用 perl 你真的要推荐人们在 2021 年使用格式吗? :-) @Dave Cross -- 我推荐使用格式了吗?我不记得了,我只是使用格式来显示结果——如果它存在并且可以完成工作,那么为什么不使用它。如果您愿意,可以使用更现代的解决方案发布您的答案。我仍然发现对于 perl 新手来说,format 非常容易理解,不需要深厚的 perl 经验。 @DaveCross -- 如果您建议用 something 代替format
,您的评论将更有价值,以证明您的观点。
@row - Modern Perl 4 edition,网页modern perl,Raku - Perl 6,Raku【参考方案2】:
我认为最简单的方法是这样的:
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use File::stat;
# Default to the current directory if one isn't given on
# the command line.
# Note: "defined-or" operator so we don't fail on a
# directory called "0"
my $dir = shift // '.';
# Use \Q...\E around the directory name to make life easier
while (my $file = glob("\Q$dir\E/*"))
say $file;
# File::stat changes the behaviour of stat() and makes
# it far easier to use
my $uid = stat($file)->uid;
my $user = getpwuid($uid);
# Simple output option :-)
say "$file / $user";
【讨论】:
【参考方案3】:使用 chomp 函数从用户输入中删除尾随换行符 (\n)。
my $directory = <STDIN>; #"/media";
chomp($directory);
【讨论】:
Can't modifychomp(my $dir = <STDIN>)
可以工作。
@row:你说得对,你通常需要chomp()
输入才能删除换行符。但这不是这里的问题。由于$directory
的值(附加了换行符)被传递给qx(ls $directory)
,因此额外的换行符被有效地忽略了。亲自尝试一下 - perl -lE '$dir = ".\n"; say qx(ls $dir)'
以上是关于在 perl 中找不到路径的主要内容,如果未能解决你的问题,请参考以下文章