ラベル Perl の投稿を表示しています。 すべての投稿を表示
ラベル Perl の投稿を表示しています。 すべての投稿を表示

2021年12月7日火曜日

Python で終了する時の呼び出し関数,行番号を報告する

 タイトル通り.inspect モジュールを利用する.
  1. import sys, inspect
  2.  
  3. def my_exit():
  4. frame = inspect.currentframe().f_back
  5. path = frame.f_code.co_filename.split('/')
  6. print("file:"+path[-1] +" in:"+frame.f_code.co_name+", line:"+str(frame.f_lineno))
  7. sys.exit()

Perl でもできる(さらにエラーメッセージを引数としてもらう).
  1. sub my_exit {
  2. my ($arg_str) = @_;
  3. my ($pkg, $file, $line) = caller;
  4. chomp($arg_str);
  5. print "Error $arg_str, in $file line $line\n";
  6. die;
  7. }

Perl の方が記述はシンプルなんだよなぁ.

2020年7月25日土曜日

Perlの二次元配列の走査

よく忘れるのでメモ.

  1. #!/bin/perl
  2.  
  3. my @ARRAY=(["A1", "A2", "A3"], ["B1", "B2", "B3"]);
  4. for(my $i=0;$i<=$#ARRAY;$i++){
  5. for(my $j=0;$j<=$#{$ARRAY[0]};$i++){
  6. printf STDERR ("$ARRAY[$i][$j], ");
  7. }
  8. }

2016年8月27日土曜日

PerlでNaNを使う.

Perlで数値解析をする際,ゼロ除算を適切に扱う必要がある.Perlはv5.6.1以上であればNaNを使える.NaNはどんな演算をしてもNaNとなるが,実数NaN共にゼロ除算ではエラーを吐いて止まってしまう.ゼロ除算時にNaNを発生し伝搬させるためには,分母が0であればNaNとなる様な関数を書いてやればよい(下の例ではsub DivNaN).
ちなみに無限も'inf'として使える.
  1. #!/bin/perl
  2. $value = 10;
  3. $value = &DivNaN($value , 20);
  4. printf("10/20= $value\n");
  5.  
  6. $value = &DivNaN('inf' , 20);
  7. printf("inf/20= $value\n");
  8.  
  9. $value = &DivNaN('nan' , 20);
  10. printf("nan/20= $value\n");
  11.  
  12. $value = &DivNaN(10 , 0);
  13. printf("10/0= $value\n");
  14.  
  15. $value = &DivNaN('nan' , 'nan');
  16. printf("nan/nan= $value\n");
  17.  
  18. $value = &DivNaN('nan' , 0);
  19. printf("nan/0= $value\n");
  20.  
  21. sub DivNaN {
  22. my ($numerator, $denominator) = @_;
  23. if ($denominator eq 0){
  24. return 'nan';
  25. } else {
  26. return $numerator / $denominator;
  27. }
  28. }
  1. % perl test.pl
  2. 10/20= 0.5
  3. inf/20= inf
  4. nan/20= nan
  5. 10/0= nan
  6. nan/nan= nan
  7. nan/0= nan