2014-04-29 2 views
0

내 목표 : 이름과 생성 날짜가있는 디렉토리에 * gz 파일을 나열하십시오. Perl : 디렉토리의 파일에서 타임 스탬프를 가져올 수 없음 -> 18 행의 초기화되지 않은 값 사용

나는 다음과 같은

#!/usr/bin/perl 
use strict; 
use warnings; 
use File::stat; 
use Time::localtime; 

my $directory = '/home/hans/.config/cqrlog/database'; 
opendir (DIR, $directory) or die $!; 
my @files = (readdir(DIR)); 
closedir(DIR); 

foreach $_ (@files) { 
    # Use a regular expression to find files ending with .gz 
    if ($_ =~ m/\.gz$/) { 
     my $file_name = $_; 
     my $file_time = (stat($_))[9]; 
     print "$file_time\n"; 
    } 
} 

을 썼다 그러나 나는 ./perl-matching-files.pl 라인 (18)에 연결 (.) 또는 문자열의 초기화되지 않은 값 $의 file_time의 자주 보이는 오류 "사용을 점점 계속 할 . " 이것은 인쇄 라인입니다.

foreach $_ (@files) { 
    # Use a regular expression to find files ending with .gz 
    if ($_ =~ m/\.gz$/) { 
     my $file_name = $_; 
     my @file_time_array = (stat($_)); 
     my $file_time = $file_time_array[9]; 
     print $file_name , " - " , $file_time , "\n"; 
    } 
} 

을하지만 다시는 마지막 인쇄 라인에 barfs :

은 또한 다음과 같은 시도했다. 나는 또한 while 루프를 시도했지만 똑같은 결과를 보았다. 하지만 파일 이름이 인쇄되므로 뭔가 올바르게 수행해야합니다. 배열을 통해 읽을 때 파일의 타임 스탬프가 읽히지 않는다고 느낍니다. 그러나 나는 전문가의 많은 부분이 잘못되었다는 것을 아는 사람이 아닙니다. 그것은 항상 인쇄 줄에 오는 것 같습니다. 모든 통찰력이 인정됩니다. 건배. 대신
my $file_time = (stat($_))[9]; 

답변

1

그렇지 않으면 당신은 이미 언급 한 디렉토리에있는 경우에만 작동 할 수있는 현재 디렉토리에 /home/hans/.config/cqrlog/database 파일을 찾고

my $file_time = (stat("$directory/$_"))[9]; 

을 시도합니다.

0

stat stat가 실패하면 빈 목록을 반환합니다. 문제에 직면 특히 때 것처럼 따라서, 에러 코드를 테스트 고려 :

my $st = stat($_) or die "No $_: $!"; 

을이 반환 한 것 :

No <filename.gz>: No such file or directory at ... 

mpapec 이미 지적한 바와 같이, 이것은 당신이 포함되지 않기 때문에 stat 호출의 경로 정보 세 가지 해결책이 있습니다 :

chdir $directory; 

2 이상

1) chdir 디렉토리로 반복하는) readdir

#!/usr/bin/perl 

use strict; 
use warnings; 

my $directory = '/home/hans/.config/cqrlog/database'; 

for my $file_name (glob("$directory/*.gz")) { 
    my $st = stat($file_name) or die "No $file_name: $!"; 
    my $file_time = $st->[9]; 
    print "$file_time\n"; 
} 

3) 또는 수동으로이 경로를 추가 glob 대신 사용 fqfn

my @file_time_array = stat("$directory/$_") or die "No $_: $!"; 
0

감사합니다. y 오우. 이틀 후에 나는 그것을 알아 냈어.

경로에 대해 충분히 명시하지 않은 것이 좋습니다. 그것을 수정했습니다.

밀러 : File :: stat를 사용하여 추가 한 glob가 작동했습니다. 나는 글로브로 일한 적이 없기 때문에 그 방향으로 나를 조종 해 주셔서 감사합니다. 그것에서 많은 것을 배웠습니다. 건배.결국

내가 단일 파일 예제와 함께 한 시간 동안 바이올린을 켜는 후 통계의 OOP 인터페이스를 시도 :

my $file_time = stat("$directory/$file_name")->mtime; 

이 내가 원하는 걸 가지고, 그래서 나는 배열 요소 번호와 같은 방법을 시도 :

my $file_time = (stat("$file_name"))->[9] or die "No $_: $!"; 

이것은 또한 효과가 있습니다. 그래서 모두 "->"를 덧붙였다.

이것이 나의 마지막 코드 다. 나는 그것이 더 예쁘고/더/더 효율적일 수 있다는 것을 알고 있지만, 지금 당장은 나에게 잘 해준다. 왜냐하면 내가 직접 썼기 때문이다. 일부 자동화 작업을 처리하기 위해 내 컴퓨터에서만 실행되는 스크립트이기 때문에 일부 추가 작업을 수행 할 시간.

#!/usr/bin/perl 
use strict; 
use warnings; 
use File::stat; 
use Time::localtime; 

my $directory = '/home/hans/.config/cqrlog/database'; 
opendir (DIR, $directory) or die $!; 
my @files = (readdir(DIR)); 
closedir(DIR); 

foreach $_ (@files) { 

# Use a regular expression to find files ending with .gz 
    if ($_ =~ m/\.gz$/) { 
# my $file_time = stat("$directory/$_")->mtime; 
my $file_time = (stat("$directory/$_"))->[9] or die "No $_: $!"; 
print "$_\n"; 
print "$file_time\n"; 
    } 
} 
관련 문제