在 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 =&lt;STDIN&gt;; 会给你/media\n,不剥离\n 你的操作系统将找不到目录。 使用chomp()&lt;STDIN&gt; 读取的数据中删除换行符通常是一个非常好的主意。但在这种情况下,没有必要将字符串(附加换行符)传递给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 modify in chomp at test.pl line 9, near ")" test.pl 的执行由于编译错误而中止 (#1) (F) 你是' 不允许分配给指定的项目,或以其他方式尝试更改它,例如使用自动增量。用户代码中未捕获的异常:Can't modify in chomp at test.pl line 9, near ")" test.pl 的执行由于编译错误而中止 @row chomp(my $dir = &lt;STDIN&gt;) 可以工作。 @row:你说得对,你通常需要chomp() 输入才能删除换行符。但这不是这里的问题。由于$directory 的值(附加了换行符)被传递给qx(ls $directory),因此额外的换行符被有效地忽略了。亲自尝试一下 - perl -lE '$dir = ".\n"; say qx(ls $dir)'

以上是关于在 perl 中找不到路径的主要内容,如果未能解决你的问题,请参考以下文章

在 @INC 中找不到 XML/LibXML.pm

错误:“在实体中找不到键路径 objectID”

在tomcat7中找不到Websocket端点路径

在 MATLAB 的搜索路径中找不到 MATLAB 超类

(Python)ValueError:在路径中找不到程序点

在 react-router-dom 中找不到路径