정렬

2013-05-03 4 views
2
sub open_directory { 
    my $directory = shift @_; 
    my @files =(); 

    opendir (my $dh, $directory) or die "Couldn't open dir '$directory' : $!"; 
    my @all_files = readdir $dh; 
    closedir $dh; 

    foreach my $files(@all_files){ 
      while($files =~ /\.htm/){ 
       push(@files); 
      } 
    } 
    return @files; 
} 

오류 코드에있다 push(@files); 오류 : Useless use of push with no values정렬

내가 .htm 또는 .html으로 끝나는 이름을 가진 파일을 처리 할 @files 배열에서 /\.htm/ 정규 표현식을 사용하여 도와주세요.

+2

이 오류 메시지가 당신에 밀어 _what_를 지정하는 것을 잊었다 것을 의미한다 :

my @html_files = glob("*.html *htm"); # html files 

은 또한 디렉토리를 삽입 할 수 있습니다 배열 그것에 대해 생각해보십시오. – Mat

+1

또한 'while'은 실제로 'if'여야합니다. – amon

+0

나는 이것이 작동해야한다고 생각한다. 'push (@files, $ files); ' –

답변

5

가장 간단한 방법은 grep 내장을 사용하는 것입니다. 조건이 참인 목록에서 해당 요소를 선택한 다음 일치하는 요소의 목록을 반환합니다. 당신이 push를 사용하려면

우리의 경우
my @even = grep { $_ % 2 == 0 } 1 .. 10; # even number in the interval [1, 10]. 

, 우리는 다음의 (a)는 한 어레이에 밀어 원하는 것을 지정하고, (b)의 경우,

my @files = grep { /\.htm/ } readdir $dh; 

을 수행 할 수 있습니다 단지 그것이 일치하지 하면서 밀어 경우 정규 표현식 일치, 않습니다

for my $file (@all_files) { 
    push @files, $file if $file =~ /\.htm/; 
} 
+0

고맙습니다. 나는이 작은 문제 : \t \t \t 경우 해결했다 { \t \t \t \t 푸시 (@ 파일을 $ 파일) ($ 파일 = ~/\를 HTM /.) \t \t \t –

+1

@DeepakTivari 정규 표현식은 (예를 들어)'foobar.htm.tar.gz'를 유효한 파일 이름으로 간주한다는 점에 유의하십시오. (정규 표현식은 파일 이름의 끝에 고정되어 있지 않기 때문에) – TLP

+0

오오 그렇습니다. 지적 해 주셔서 감사합니다. 나는 여전히 초보자 물건을하고 있지만 제대로 정규 표현식을 설정하는 것을 기억할 것입니다 : D –

0

한번에 이해는 할 수 낮은 코드는 .htm 또는 .html 파일 만 처리합니다.

use strict; 
use Data::Dumper; 

my @all_files = ("abc.htm", "xyz.gif", "pqr.html") ; 
my @files; 
foreach my $files(@all_files){ 
    if($files =~ /\.html?/){ # This will process only .htm or .html files 
     push(@files, $files); 
    } 
} 
print Dumper(\@files); 

출력 :

$VAR1 = [ 
      'abc.htm', 
      'pqr.html' 
     ]; 
2

amon하면 파일 이름을 필터링하는 grep를 사용하여, 귀하의 질문에 대한 정확한 답을 주셨습니다. 그러나, 당신이하려고하는 기능이 나에게 더 glob 같은 소리를 달성하기 :

my $dir = "foo"; 
my @html_files = glob("$dir/*.html $dir/*.htm"); 
+0

대단히 감사합니다. 나는이 작은 문제를 해결했다 :) –