【问题标题】:foreach loop through an array that has directory paths and filenames(perl)foreach 循环遍历具有目录路径和文件名的数组(perl)
【发布时间】:2013-05-30 00:17:59
【问题描述】:
1440665    8 drwxrwx---   2 smithjoe   smithjoe      1024 May 29 09:01 .
1960596    8 -rwxrwx--x   1 smithjoe   smithjoe      3190 May 29 09:00 ./file1.prl
3197096    8 -rw-rw----   1 smithjoe   smithjoe      1594 May 24 16:11 .dir/documents/file2.prl~
1790401    8 -rw-------   1 smithjoe   smithjoe      3205 May 29 09:01 .dir/files/file3.prl
6754401    8 -rw-------   1 smithjoe   smithjoe      3205 May 29 09:01 .smithjoe/file3.prl
2737401    8 -rw-------   1 smithjoe   smithjoe      3205 May 29 09:01 .smithjoe/folder2

我有一个包含上述数据的数组(@file_path)。我希望能够从数组中提取文件/目录名称(它是该行的最后一个元素)。我必须使用 foreach 循环。一旦我这样做。我跳过目录并将它们保存在一个新数组中。我使用 push 命令附加该数组。

帮帮我。请。

【问题讨论】:

  • 你是怎么想出这样的数组的?有更好的方法来读取目录。
  • @mpapec:鉴于语句“我必须使用 foreach 循环”,我猜这是作业,解析ls -l 的输出也是赋值的参数之一。跨度>
  • @DaveSherohman 看来老师们布置作业的方法很深刻。

标签: perl


【解决方案1】:

我要重申@mapeec 的评论,您可能希望首先通过修复您获得的数据来解决这个问题,而不是试图操纵它。另外,我需要通过说这会阻塞文件名和路径中的空格来作为前缀——而且我不确定是否有一种好的、可靠的方法来避免不会引入其他怪癖的方法,因此建议修复尝试处理数据之前的数据。

但是,如果您对现有数据感到困惑,并且您确信文件名/路径中不会有空格:

my @paths;
foreach my $line (@file_path) {
    my @parts = split /\s+/, $line;
    push @paths, $parts[-1];
}

...应该让你上路。

【讨论】:

  • @sohailkhan 我对你想要什么感到困惑;在我的示例中,至少在我测试它时,@paths 包含来自ls 输出的每一行的最后一部分(即路径和文件名位)。如pastebin.ca/2384570
  • 2384570 是从哪里来的?你想要输出的每一行的 first 部分而不是最后一个吗?因为一堆人一直在假设你想要最后一个来回答这个问题。无论如何,如果您这样做,只需将 [-1] 替换为 [0] 即可获取第一部分而不是最后一部分。
  • 啊哈。这可能是最安全的——您可以在对split 的调用中将/\s+/ 替换为/\//,而我的原始代码示例将为您提供每行最后一个/ 之后的所有内容——即文件名。
  • perldoc.perl.org/functions/split.html 应该可以帮助您将每行的最后一部分拆分为一个列表,然后perldoc.perl.org/perldata.html 具有您处理该列表所需的信息(可能通过将其粘贴到一个数组中)。
【解决方案2】:

给你一些提示:

  • 假设文件路径永远不会包含空格,您可以使用split 命令分隔每一行的字段并将它们分配给一个数组。如果它们可以包含空格,split 将采用可选的第三个参数来表示要返回的最大字段数。

  • 在 Perl 中,$array[-1] 返回 @array 中的最后一项。

这两个提示应该允许您从每一行获取文件路径。

【讨论】:

  • @sohailkhan perldoc -f split
  • 你可以在没有 -l 选项的情况下使用 ls -- 然后你就已经准备好使用 foreach 迭代数据了:-)
  • 如果您通过不同的方法获取数据,那么备用源格式化数据的方式将决定您必须做什么。
  • @mpapec 我总是忘记明确使用-1——如果你用管道连接到其他东西(这是我一直想要的),这是暗示——所以为提醒欢呼:-)跨度>
猜你喜欢
  • 2013-09-20
  • 1970-01-01
  • 2013-12-16
  • 2021-12-06
  • 2013-12-11
  • 1970-01-01
  • 2021-02-20
  • 2018-09-15
  • 2011-01-10
相关资源
最近更新 更多