2012-02-22 5 views
0

Hello stackpeople!while 루프 내에서 Perl bash 명령을 사용하면 말도 안되는 소리가납니다.

나는 결과를 해결하고 온라인으로 cgi 파일에 표시 할 2 가지가 있습니다.

을 [:

A)과 같아야 각 폴더 안에

결과를 index.html을의 나이를 결정 주어진 경로

B) 모든 foldernames를 얻을 수 번호] [폴더 이름] [파일]

이 cgi 페이지는 perl이 설치된 solaris 서버에서 실행됩니다. 5.8.4

내 솔루션은 bash와 perl의 조합입니다. 이 보여 이제 펄 코드를

#!/bin/bash 
# 
find /test/ -type d | sed -e 's/^.*\///' 

이 날에/테스트의 모든 foldernames의 좋은 목록을 제공/

: 내가 쓴) bash는 스크립트를 문제 A) (폴더 이름을 해결하기 위해 브라우저에서 출력 :

#Establish a pipeline between the bash and my script. 
    my $bash_command = '/test./foldernames.bash'; 
    open(my $pipe, '-|', $bash_command) or die "Can't open pipe: $!"; 
    # initialize variables 
    my $foldername = ""; 
    my $i = 0; 

    # Process the output from bash command line by line. 
    while (my $line = <$pipe>) 
    { 
    $foldername = $line; 
    $i = $i+1; 

    print" <tr><td>$i</td><td>$foldername</td></tr>"; 
}#end while 

이것은 작동합니다! 나는 [번호]와 [폴더 이름]으로 멋진 테이블을 얻을 것이다! 이제 까다로운 부분이 있습니다! 또한 각 폴더에있는 index.html의 날짜를 원합니다.

ls -ltr /test/folder1/*.html | tail -1 | awk '{printf"%3s %1s %s\n",$6, $7, $8}` 

이 나에게 완벽한 출력을 제공 : 그러므로 내가 다른 bash는 스크립트가 10시 56분년 2 월 (22)는 지금 내 테이블에이 정보가 필요합니다. 나는 while 루프에서 내 펄 스크립트에이 줄을 추가 한 : 나는 문자열로 폴더 이름을 추가 할 때이 완벽하게 작동

$timestamp = `ls -ltr /test/folder1/*.html | tail -1 | awk '{printf"%3s %1s %s\\n",\$6, \$7, \$8}`; 

. 내가 교환하자마자 폴더 1$ foldername 나는 말도 안되는 "ls"정보를 얻을 것이다.

왜 그렇습니까?

편집은 : 지금은 사용했다 :

use File::stat; 
use Time::localtime; 
my $timestamp = ctime(stat("/test/folder1")->mtime); 

이것은 LS 출력을 구문 분석에 비해 방법이 더 안전합니다. 하지만 여전히 $ foldername에 문제가 있습니다. 나는 길이 함수를 사용하여 $ Foldername 길이를 결정했습니다.

$의 폴더 이름은 (7)의 길이를 가지고 있지만, 문자열 출력은 6 문자가 있습니다 토마토를

그래서 잘라을 시도했습니다/항상 같은 결과는 $ 폴더 이름을 씹는 : 7 개 문자를!

답변

4

먼저 ls 출력을 프로그래밍 방식으로으로 구문 분석하지 않습니다. 어떤 시점에서 깨지기도하고, 멋진 방식으로 그렇게하는 것이 거의 확실합니다. find의 출력을 파싱하는 것은 거의 안전합니다 (예 : 대부분의 Unix에서 디렉토리 이름에는 줄 바꿈 문자가 포함될 수 있으며 그 가능성을 잘 다루는 코드는 보이지 않습니다).

펄은 a stat function입니다.이 파일은 어떤 파일이나 디렉토리 (atime, mtime 또는 ctime, 사용 가능한 경우)의 날짜와 시간뿐만 아니라 많은 다른 정보를 제공합니다. 그런 다음 strftime과 같은 것을 사용하여 더 좋은 출력을 위해이 시간 소인을 형식화 할 수 있습니다.

2

$foldername"folder1"이 없기 때문에 출력이 달라질 것으로 생각됩니다.

사실, 이전 코드를 보면 chomp을 입력하지 않으면 $foldername"folder1\n"이 포함될 확률이 더 높아집니다.

$foldername에 공백이 포함되어 있으면 접근이 실패합니다. 요즘은 꽤 바보 같은 제한 사항입니다. stat 또는 File::stat을 확인하십시오.

+0

File :: stat; 사용 시간 :: localtime; my $ timestamp = ctime (stat ("/ test/folder1") -> mtime); 이 방법은 ls 출력을 구문 분석하는 것보다 훨씬 안전합니다. 하지만 여전히 $ foldername에 문제가 있습니다. 길이 함수를 사용하여 $ Foldername 길이를 결정했습니다. $ foldername은 길이가 7이지만 문자열 출력에는 6 개의 문자 만 있습니다. tomato 그래서 Chop/chomp에 $ foldername을 시도했지만 항상 같은 결과를 얻었습니다 : 7 개의 문자! – Ajin

관련 문제