2016-08-16 3 views
0

제대로 작동하는 스크립트를 얻었으며 그 결과가 만족 스럽습니다. 여기에서 찾은 정보 덕분입니다.Perl - 업데이트 타임 스탬프를 생성하는 방법

그러나 내가 옳은 것처럼 느낄 수없는 한 가지는 타임 스탬프입니다. 현재, 나는 $ 타임 스탬프를 호출 할 때를 제외하고 잘 작동이

use POSIX qw/strftime/; 
my $timestamp = strftime('%m/%d/%Y %I:%M.%S %p %Z',localtime); 

을 사용하고, 항상 (전혀 업데이트하지 않습니다) 코드의 모든 부분에 대해 동일한 타임 스탬프 될 것입니다.

나는 (내가 전에 해본 적이 없다) 서브 루틴으로이 문제를 해결하기 위해 시도 :

sub GetLoggingTime { 
    use POSIX qw/strftime/; 
    my $LoggingTime = strftime('%m/%d/%Y %I:%M.%S %p %Z',localtime); 
    return $LoggingTime; 
} 

my $timestamp = GetLoggingTime(); 

print "$timestamp \n"; 
sleep(2); 
print "$timestamp \n"; 

분명히 두 개의 인쇄 및 슬립이는 "업데이트"경우 시도하고 볼 수 있으며, 이는 그것을 그렇지 않습니다. 두 타임 스탬프가 같은 시간에 인쇄됩니다.

그런 다음 서브 루틴을 직접 호출하여 서브 루틴 내에서 인쇄를 추가하고 & GetLoggingTime을 사용하여 호출했지만 아무 것도 수행하지 않았습니다 (출력 없음).

나는 분명히 뭔가 빠져있는 것을 알고 있지만, 나는 그것을 찾을 수없는 것 같습니다. 스크립트를 작동시키는 간단한 방법이 있습니까? 아니면 스크립트가 진행될 때 실시간으로 업데이트되는 타임 스탬프를 얻을 수있는 간단한 방법이 있습니까?

미리 감사드립니다.

+3

업데이트 할 값을 얻기 위해 서브 루틴을 다시 호출해야합니다. – squiguy

답변

5

서브 루틴 안에 use 문을 넣지 않아도되며 프로그램의 맨 위에 배치 할 수 있습니다.

귀하의 코드 :

my $timestamp = GetLoggingTime(); 

print "$timestamp \n"; 
sleep(2); 
print "$timestamp \n"; 

GetLoggingTime()를 호출, 저장, 출력 $timestamp 내부. 즉 값이 $timestamp 안에 정적으로 유지된다는 의미입니다. 당신이 현재 시간마다의 출력을 얻고 싶은 경우에, 당신은 당신이 업데이트 된 값 필요할 때마다 GetLoggingTime()를 호출해야합니다 : 직접 GetLoggingTime()의 결과를 연결하여

my $timestamp = GetLoggingTime(); 
print "$timestamp \n"; 
sleep(2); 
$timestamp = GetLoggingTime(); 
print "$timestamp \n"; 

당신은 변수를 사용하지 않도록 할 수 있습니다 당신의 문자열 :

print GetLoggingTime() . " \n"; 
sleep(2); 
print GetLoggingTime() . " \n"; 

또는 타임 스탬프는 항상 공백과 줄 바꿈을 필요로하는 경우, 당신은 포함 할 수 내부 GetLoggingTime()

sub GetLoggingTime { 
    return strftime('%m/%d/%Y %I:%M.%S %p %Z',localtime) . " \n"; 
} 
+0

아, Drav에게 감사드립니다. 정확히 내가 한 일이었습니다! 나는 당신이 서브 루틴에 직접 인쇄를 할 수 있다는 것을 깨닫지 못했습니다! 추가 연결을 통해 배치를 위해 필요에 따라 다른 인쇄 문의 내에서 호출 할 수 있다고 가정합니다 (예 : 인쇄 문자열의 첫 번째 부분 일 필요는 없습니다). 도움이 많이 필요합니다! – Kittamaru

+0

절대적으로 올바른 GetLoggingTime()은 문자열을 포함하는 "스칼라"를 반환합니다.이 문자열은 선택한 다른 문자열과 연결할 수 있습니다. –

0

tied variables을 사용하여 원하는 것을 얻을 수 있습니다. 그러나 tie ing은 펄의 다소 난해한 부분이며 프로그램을 느리게 사용한다는 점에 유의하십시오.

간단한 타이 타임 스탬프 예제를 작성하여 시연 할 예정이었습니다. 그러나 Tie::Scalar::Timestamp 이미 존재하는 것 같습니다.

관련 문제