2013-07-30 56 views
1

我不想指定文件名,只想使用擴展名。檢查目錄中是否存在具有給定擴展名的文件

if(-e "./dir/*.c"){ 
} 

我要檢查是否有任何.c文件中./dir目錄中。 這可能嗎? 由於我沒有得到正確的結果,如果有人知道在這種情況下使用此-e開關的任何替代或正確的方式,請幫助我。

+0

這不是開關,'-e'開關是一行程序使用的開關。這是完全不同的東西。你有什麼是[文件測試一元運算符](http://perldoc.perl.org/functions/-X.html)。 – TLP

回答

5

這可能會幫助:

my @list = <*.c>; 

if (scalar @list == 0) { 
    print "No .c File exist."; 
} else { 
    print "Existing C files are\n", join (", ", @list), "\n"; 
} 

代替 產卵子shell通過 使用水珠<*.c>,你也可以使用opendirreaddir功能如下擴展文件列表:

opendir DIR, $path; 
my @list = readdir DIR; 
closedir (DIR); 
my $flag = 0; 

foreach $file (@list) { 
    if ($file =~ m/^.*\.c$/i) { 
    print "$file\n"; 
    $flag = 1; 
    } 
} 

if ($flag == 0) { 
    print "No .c file exists\n"; 
} 

在哪裏$path是一個指示目錄路徑的變量。

+2

或更簡潔地說,如果(標量(()=

))' – ysth

+0

''''又名'glob'在很長時間內還沒有使用子殼體 – ysth

+1

已更正。我剛開始學習perl :-) – phoxis

1

您可能會對File::Find模塊感興趣,該模塊是Perl 5中的核心模塊。它是遞歸的,可能是您想要的,也可能不是。

use strict; 
use warnings; 
use File::Find; 
use Data::Dumper; # for output only 

my @found; 
find(sub { /\.c$/i && push @found, $File::Find::name; }, 'dir'); 
print Dumper \@found; 

$File::Find::name包含文件的完整路徑。正則表達式匹配包含基本文件名的$_。請注意,find()子例程的第一個參數是匿名子代碼塊。

如果要檢查空輸出,則在標量上下文中使用該數組將返回其大小。零(假)大小意味着找不到匹配。

if (@found) { 
    print "Found files: @found\n"; 
} else { ...} 
相關問題