2

我在 Perl sub findfiles 中有一个子例程,我必须传递一个带引号的值“*/*”作为输入参数,因为它在没有引用的情况下抱怨,另一方面在我的子例程中我需要它不被引用(可能是!)问题是当我打印要检查的值时,我没有看到任何引用或任何东西,但可能有一些特殊的隐藏字符或我不知道的东西?当我直接使用 */* 时,我的代码可以正常工作,但当我将它作为输入参数传递时,我的代码不能正常工作你知道吗?

sub findfiles {

    $dirname=$_[0];
    my @temp = grep {-f} <$dirname>;
    print @temp;       

}
&findfiles("*/*"); doesnot work

but 
   sub findfiles {

    $dirname=$_[0];
    my @temp = grep {-f} <*/*>;
    print @temp;       

}

做它的工作

4

3 回答 3

8

使用您更新的代码,我可以看到您的错误所在。尽管

my @temp = grep {-f} <*/*>;

作为一个glob

my @temp = grep {-f} <$dirname>;

被解释为文件句柄上的readline()$dirname

如果您想避免歧义,可以使用以下功能glob

my @temp = grep -f, glob $dirname;

您可能还对使用File::Find感兴趣,它以递归方式查找文件。

注意:如果您打开了警告,则可以避免此问题。根据经验,在 perl 中编码而不使用

use strict;
use warnings;

...是一个非常糟糕的主意。这两个 pragma 将帮助您识别代码中的问题。

于 2012-08-20T16:46:59.800 回答
2

问题是当我打印要检查的值时,我没有看到任何报价

$test="*/*"
          ^string delimiter
       ^^^string
      ^string delimiter

当您打印一个字符串(无论是来自字符串文字、标量或其他任何内容)时,您都会打印字符串

分隔符不会被打印。他们只是告诉 perl 数据的边缘在哪里。

于 2012-08-20T16:30:24.710 回答
1

你知道File::Find吗?

use File::Find ();

File::Find::find( sub { say $File::Find::name if -f; } => $my_root );

或者File::Find::Rule(见file)呢?

say foreach File::Find::Rule->file->in( $my_root );
于 2012-08-20T17:06:09.117 回答