我在Perl子查找文件中有一个子程序,我必须传递一个引用值“* / *”作为输入参数,因为它没有引用就抱怨了,另一方面在我的子程序中我需要它不加引号(可能是!)问题是当我打印值检查时,我没有看到任何引用,或者任何东西但可能有一些特殊的隐藏字符或我不知道的东西?当我直接使用* / *时,我的代码正常工作,但当我将其作为输入参数传递时,我的代码无效 你有什么想法吗?
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;
}
完成工作
答案 0 :(得分:8)
通过更新后的代码,我可以看到您的错误所在。而
my @temp = grep {-f} <*/*>;
作为glob
my @temp = grep {-f} <$dirname>;
在文件句柄$dirname
上被解释为readline()。
如果您想避免含糊不清,可以使用glob
的函数:
my @temp = grep -f, glob $dirname;
您可能还对使用File::Find感兴趣,{{3}}会递归查找文件。
注意:如果您已启用警告,则可以避免此问题。根据经验,在不使用
的情况下在perl中编码use strict;
use warnings;
......是一个非常糟糕的主意。这两个pragma将帮助您识别代码中的问题。
答案 1 :(得分:2)
问题是当我打印要检查的值时,我没有看到任何引用
$test="*/*"
^string delimiter
^^^string
^string delimiter
当你打印一个字符串(无论是字符串文字,标量还是其他)时,你打印字符串。
分隔符不会被打印出来。他们只是告诉perl数据边缘的位置。
答案 2 :(得分: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 );