web-dev-qa-db-ja.com

Perlのlocaltimeとprintを使用してタイムスタンプを取得するにはどうすればよいですか?

現在の時刻を取得するために次のステートメントを使用しました。

  print "$query executed successfully at ",localtime;
  print "$query executed successfully at ",(localtime);
  print "$query executed successfully at ".(localtime);

出力

 executed successfully at 355516731103960
 executed successfully at 355516731103960
 executed successfully at Wed Apr  7 16:55:35 2010

最初の2つのステートメントは、現在の時刻を日付形式で出力していません。 3番目のステートメントは、日付形式でのみ正しい出力を提供します。

私の理解は、最初のものはスカラーコンテキストで値を返すことなので、数値を返すことです。

次に、2番目の印刷では、リストコンテキストでのみlocaltimeを使用しましたが、なぜ数値も出力されます。

23
kiruthika

おそらく、Perlでのプログラミングについて学ぶことができる最も重要なことは、コンテキストです。多くの組み込みサブルーチンと演算子は、コンテキストに応じて異なる動作をします。

print "$query executed successfully at ", localtime, "\n"; # list context
print "$query executed successfully at ",(localtime),"\n"; # list context
print "$query executed successfully at ". localtime, "\n"; # scalar context
print "$query executed successfully at ".(localtime),"\n"; # scalar context

print "$query executed successfully at ", scalar  localtime, "\n"; # scalar context
print "$query executed successfully at ", scalar (localtime),"\n"; # scalar context

これはステートメントを分割することでより明確にすることができます。

my $time = localtime; # scalar context
print "$query executed successfully at $time\n";

my @time = localtime; # list context
print "$query executed successfully at @time\n";
31
Brad Gilbert

localtime の戻り値は、コンテキストによって異なります。リストコンテキストでは9要素のリストですが、スカラーコンテキストではctime(3)値です。

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime;
my $now_string = localtime;  # e.g., "Thu Oct 13 04:54:34 1994"

現在、 print は引数のリストコンテキストを提供します。これがprint localtimeがリストから数値を出力する理由です(デフォルトではセパレータはありません)。 .連結演算子(3番目のステートメントと同様)または localtime を使用して、scalarにスカラーコンテキストを強制できます。

print "".localtime;
print scalar localtime;
10
Eugene Yarmash

scalar はスカラーコンテキストを強制します。

print scalar localtime ();

2番目の例では、それは明らかにリストコンテキストであるため、連続して数値を出力するだけです。たとえば、

 print join (":", (localtime));

コロンで結合された数字が表示されます。

7
user181548

最初と2番目の両方がリストコンテキストの値を返しますが、おそらく期待どおりではありません。現地時間で括弧を使用しても、何の役にも立ちません。ただし、次のコードを使用して、返されたリスト項目を個別に取得できます。

@list = ($sec,$min,$hour,$day,$mon,$year_1900,$wday,$yday,$isdst)=localtime;
print join("\n",@list);
4
Mike

現在の時刻のタイムスタンプを取得したい場合は、関数time()を使用できます

0
user2572371