2016-08-16 4 views
0

私はここで見つけた情報の大部分のおかげで、これまでのところうまく機能しているスクリプトを手に入れました。Perl - 更新タイムスタンプを生成する方法

しかし、私が正しく得ることができないことの1つは、タイムスタンプです。現在、私は$タイムスタンプを呼び出すとき、それは常に(まったく更新されません)、コードのすべての部分で同じタイムスタンプになることを除いて、よく働くこの

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

を使用しています。

私は(私は前にやったことがない)サブルーチンでこれを解決しようとしました、明らかに2枚のプリントや睡眠がしようとすると、それは「更新」であるかどうかを確認するためにある

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()の結果を連結することで、変数の使用を避けることができ

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

:あなたは、現時点の出力を毎回取得したい場合は、あなたが更新された値を必要とするGetLoggingTime()たびに呼び出す必要があります文字列:

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はPerlのかなり難解な部分であり、それを使うとプログラムが遅くなることに注意してください。

シンプルタイドタイムスタンプの例を書いて説明しました。しかし、Tie::Scalar::Timestampが既に存在するようです。

関連する問題