perlメモ

== perlメモ ==
;perlを覚えておらず、毎回ググるのが面倒なので、ここを借りていろいろメモっておきたい。


=== ファイルオープン ===
 $datafile=ファイル名
: ファイル内容を配列にぶちこむ
 open(FH, $datafile);
 @list = <FH>;
: ファイルを読み込み、ループさせる。
 open(IN, $datafile);
 while (<IN>) {
  print $_;
 }
: ファイルへ出力する(追加の場合は>を>>に) 
 open(FH, ">$datafile");
 print FH $line;
 close(FH);


: gzファイルを入力
 my $file = 'que_1.tsv.gz';
 open my $fh, "zcat $file 2>/dev/null |" or die "Can't zcat '$file' for reading: $!";
 #処理
 close $fh


=== 配列をソート ===
: 1行中で、","で値を分けてある複数の文を、任意の値で昇順でソートする。
 @array = {'1,2,3,4','5,4,3,2'}←みたいな感じ
 @sort = sort { (split(/,/,$a))[0] cmp (split(/,/,$b))[0] } @array; #文字列
 @sort = sort { (split(/,/,$a))[0] <=> (split(/,/,$b))[0] } @array; #数値
: []内の数字が示す値でソートする。0が左端 つまりこの場合、1と5の部分をソート
: 「,」の記号も変更可能
: 降順にしたい場合はsortの部分をreverse sortにする
: 一番上の要素を取りたい場合はshift、一番下の要素ならpopと以下のようにする。
 $top = shift(@sort);
 $bottom = pop(@sort);


=== サブルーチン ===
: 宣言の仕方と利用方法等
 sub A{
 my ($b) = @_;
 $b++;
 return $b;
 }
 
 my $a=3;
 $a = &A($a);
: とか。 my ($b) = @_ のときに()を忘れると引数の数が$bに入るだけになる。
: また引数が複数の場合は入力するときは、($a,$b)とし、受け取る時は、左から、$_[0]、$_[1]のようにする


=== 小数点の桁指定 ===
 $x = sprintf "%3.2f", $a;


=== ハッシュ ダブりをカウント ===
: ハッシュを使って、配列内の同じ要素をカウントし、出現数を表示する。
 foreach my $key(@array){
   $counter{$key}=$counter{$key}+1;
 }
 foreach my $key(sort(keys(%counter))){
   print "$key - $counter{$key}\n";
 }


=== 乱数 ===
 rand()      :0.787165785514848
 rand(10)     :5.06715806757228
 int(rand(10))     :7
: 0から1.0までの範囲の浮動小数点の乱数を返す。
: ()に数値を入力すると、その値まで表示されるような感じ 
: int()に入れると、整数が表示(この場合、実質0〜9になるのかな)
: 範囲指定したかったらint()の中で初期値を足す


=== 配列をランダムに並べ替え ===
 srand;
 @array = 1 .. 100;
 @new;
 for( @array ){
 my $r = rand @new+1;
 push(@new, $new[$r]);
 $new[$r] = $_;
 }
 print "@new\n";


=== 半角を全角に変換 ===
 require 'jcode.pl';
 jcode::tr(\$str, '0-9A-Za-z','0-9A-Za-z' );
 jcode::h2z_euc(\$str);
 jcode::tr(\$str,'!"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~。、・「」','!”
 #$%&’()*+,−./:;  <=>?@[¥]^_`{|}〜。、・「」'); 
* jcode.plを適当にダウンロードしてフォルダに置く
* $strに変換した文字列(文字)
* h2zは多分英語を半角から全角にする。2行目と3行目は同じ意味かも
* 全角を半角にしたいなら''の中身を逆にする。

=== 文字コードの変換 ===
* euc-jpからutf8に変換
: 一旦shiftjisにしてから変換すると文字化けが少なくなるらしい。
 my $w3 = encode( 'shiftjis', decode( 'euc-jp', $w2 ) );
 $w2 = encode( 'utf8', decode( 'shiftjis', $w3 ) );
* utf8からeuc-jpに変換
 my $w3 = encode( 'shiftjis', decode( 'utf8', $w2 ) );
 $w2 = encode( 'euc-jp', decode( 'shiftjis', $w3 ) );

=== mecab ===
 my $mecab = `echo "$snt"|mecab`;
: $mecabに$sntをmecabに通したものが入る。
 Encode::from_to($snt, "utf8", "euc-jp");
 my $kts = `echo "$snt" | mecab`;
 Encode::from_to($kts, "euc-jp", "utf8");
: 文字コード対策
=== ファイルの存在を確認 ===
 my $filename = "a.txt";
 if( -f $filename ) { #ある場合の操作 }


== コマンドメモ ==
* nkf -w filename > filename
* nkf -e --overwrite filename
: -eでeuc-jp -wでutf8に --overwriteはそのままファイルを上書きする

* emacsの文字コード変更
 C-x RET f
 C-x RET t
 C-x RET k
* その後にeuc-jpなら
 euc-jp
Comments