在Perl中取消引用字符串

时间:2012-08-20 16:26:28

标签: perl

我在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;       

}

完成工作

3 个答案:

答案 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 );