Perl覚書き

これまでに使ったperlのサンプルコード等をちょこっとメモっています。

パッケージ デバッグ 日付 文字コード お小遣い(広告)

パッケージ

【定数定義】

  パッケージとはperlでの名前空間のこと。
  定数を外部ファイル(パッケージ名(例ではCNST).pm)に定義してする。
  モジュールをスッキリさせたいときに使うと便利。
  
  package CNST;     # パッケージ名
  use constant {
    CN0    => 0,    #定数として使う値
    CN1    => 1     #定数として使う値
  };
  1;                #これが無いとエラー
  
  #上記を実行モジュールと同じ場所に置いて呼び出すと参照できる。
  #呼び出し側は以下のように書く。
  
  use CNST;
  my $hoge = CNST::CN0;
  print "$hoge\n";
  

【関数定義】

  関数も同じく外部ファイル(パッケージ名(例ではFNC).pm)に定義する。
  
  package FNC;      # パッケージ名
  sub hello {
    print "hello world";
    return
  };
  1;                #これが無いとエラー
  
  #呼び出し側は以下のように書く。
  
  use FNC;
  print &FNC::hello;
  

デバッグ

【Perlデバッガ】

  cのgdbのようなデバッグツール。「-d」オプションで起動する。
  perl -d test.pl
  デバッガを起動すると最初の行で停止する。「h」コマンドでヘルプを見ることができる。
  よく使うコマンドを覚えると便利。
  
  n : 1行実行
  s : シングルステップ実行(サブルーチン内部もステップ実行)
  c : 指定行まで実行
  p : 変数の中身を表示
  x : 変数の中身を展開して表示(リファレンスを渡す。例)x \%hash)
  
  

広告

日付

【エポック秒】

  標準のPerlでは日付関連の処理をする際に貧弱なところがある。
  Perlでは、エポック秒を求めてから日付を計算するのが基本的な流れになる。
  
  まず、日付文字列からエポック秒を取得する。文字列の取得には正規表現を用いている。
  
  use Time::Local;

  $time = time_from_str("2016-01-01 13:00:00");
  print "time:$time\n";

  ####
  sub time_from_str {
    my $time_str = shift;
    return unless $time_str;
    
    my $time = 0;
    if ($time_str =~ /^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/) {
    	$time = timelocal($6, $5, $4, $3, $2-1, $1);
    }
    return $time;
  }

  exit;
  

【日付計算】

  今度は逆にエポック秒から日付を計算する。
  
  use Time::Local;

  $ystday = ystday_from_time(1451620800);  #2016-01-01 13:00:00のエポック秒
  print "ystday:$ystday\n";
    
  ####
  sub ystday_from_time {
    my $time = shift;
    my $ytime = 0;
    my $sec = 0; $min = 0; $hour = 0; $mday = 0; $mon = 0; $year = 0; $wday = 0; $yday = 0; $isdst = 0;
    my $ystday = "";
    
    return unless $time;
    
    my $ytime = $time - 86400;  # 昨日(60*60*24)
    
    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($ytime);
    $ystday = sprintf("%d%d%d",$year + 1900,$mon + 1,$mday);
    
    return $ystday;
  }

  exit;
  

文字コード

【eucファイル→処理→utfファイル】

  入力ファイル文字コードがPerl実行環境の文字コードと異なる場合にはデコード・エンコードをする。
  文字コード指定箇所は必要に応じてShift_JIS,cp932等に書き換える。
  
  use Encode;

  #出力ファイルオープン
  open(OUTFILE, ">./out.txt");

  #入力ファイルオープン(euc-jp)
  open(IN, "<./in.txt") || die "Error:Can't Open";

  while(my $line = Encode::decode('euc-jp',)){
    chomp $line;
    
    print OUTFILE Encode::encode('utf-8', "$line\n");
  }

  close(IN);
  close(OUTFILE);

  exit;