2014-10-11 3 views
1

처음에 ARGV [0]이 파일인지 디렉토리인지 확인하는 경우 정확한 결과가 적용되어 정상적으로 작동합니다. 그런 다음 하위 파일로 내려 가면 다시 시도하고 아무 것도 반환하지 않습니다. 이것은 작은 어리석은 질문처럼 보일지도 모르지만 주말에 프로그래밍과 학생에 대한 도움이 부족합니다. 때로는 새로운 눈 세트가 도움이 될 수 있습니다. 미리 감사드립니다. 이미 언급 한 바와 같이 당신은 당신의 파일 경로를 놓치고if (-f)가 작동하지 않는 이유는 무엇입니까?

#!/usr/bin/perl -w 

my %hash; 
my $args = @ARGV; 

my $dh = $ARGV[0]; 

if (-f $dh) { 
    words($dh); 

} elsif (-d $dh) { 
    files($dh); 
} 

sub words { 
    open(my $file, '<', $_[0]) or die 'cant open file'; 
    while (my $line = <$file>) { 
     chomp $line; 
     @words = split(/\s+/, $line); 
     foreach $word (@words) { 
      $word =~ tr/A-Z/a-z/; 
      $hash{$word}++; 
     } 
    } 

    foreach $key (keys %hash) { 
     print $key. " " . $hash{$key} . "\n"; 
    } 
} 

sub files { 
    opendir(DH, $_[0]); 
    my @paths = grep !/^\./, readdir(DH); 
    closedir(DH); 
    foreach (@paths) { 
     if (-f $_) { 
      print $_. "\n"; 
     } 
    } 
} 
+0

에 오신 것을 환영합니다 펄 및 SO :

다음은이 모듈을 사용하여 다시 작성 스크립트입니다. 상단에 ['use strict;'] (http://perldoc.perl.org/strict.html) 및 ['경고 사용;] (http://perldoc.perl.org/warnings.html)을 포함하십시오. 모든 펄 스크립트. 이것은 Perl에서 배우고 좋은 프로그래머가되기 위해해야 ​​할 # 1 것입니다. – Miller

답변

3

,

if (-f "$_[0]/$_") .. 

또는 덜 모호한 수 있도록,

sub files{ 
    my ($path) = @_; 

    opendir(my $DH, $path); 
    my @paths = grep !/^\./, readdir($DH); 
    closedir($DH); 

    foreach (@paths) { 
    if (-f "$path/$_") { 
     print "$_\n"; 
    } 
    } 
} 
+1

이것은 완벽하게 작동했습니다! 고맙습니다. 사소한 일임을 알았지 만, perl에 대해 충분히 알지 못합니다. – user3491205

1

, readdir의 반환 값은 포함 basename. 따라서 파일 테스트를 수행하려면 chdir 또는 경로 정보를 명시 적으로 포함시켜야합니다.

if (-f "$_[0]/$_") { 

하나 개의 대안 솔루션은 크로스 플랫폼 경로 지정 조작을 수행하기위한 Path::Class 또는 이와 유사한 모듈을 사용하는 것입니다.

use strict; 
use warnings; 

use Path::Class; 

my $path = shift // die "Usage: $0 <Dir or File>\n"; 

words($path) if -f $path; 
files($path) if -d $path; 

sub words { 
    my $file = file(shift); 

    my %count; 
    $count{ lc($_) }++ for split ' ', $file->slurp; 

    for my $key (keys %count) { 
     printf "%s %s\n", $key, $count{$key}; 
    } 
} 

sub files { 
    my $dir = dir(shift); 

    for ($dir->children) { 
     next if $_->is_dir; 
     print "$_\n", $_->basename; 
    } 
}