2

Perlのサブルーチン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;

...非常に悪い考えです。これらの2つのプラグマは、コードの問題を特定するのに役立ちます。

于 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 に答える