仕事の中でperlというプログラム言語を使うことがあったので、実際に習得したことを忘れないように書いてます。
もしかしたら一部勘違いしていて間違っている部分もあるかもしれませんのでご了承ください。
変数の型まで宣言しなくていいし、配列も要素数を考えなくて良かったり、
txtやcsvなどいろんなファイルを読み込んで中身を編集して書き出したりするのに向いていて便利です。
あとけっこうアバウトな書き方でも動いたりするので使いやすい言語だと思います。
以下に使用例を半分メモ代わりにいくつか書きます。
変数宣言は "our" とか "my" とかで、普通の変数?は整数でも実数でも文字列でも頭に "$" マークをつけるだけ、
配列の場合は "@" マーク、連想配列の場合は "%" マークをつけるだけです。(変数は宣言しなくても使えます)
- 使用例その1:csvファイルを読み込んで例えば1、3、5列目を抜き出してタブ区切りでtxtに書き出す。
(#はperl中でのコメントアウトです。)
use strict; #変数宣言を強要するための文。これをつけると宣言をしない場合エラーになる。
my $infile = "input.csv"; #読み込みファイルの指定。プログラムファイルと同フォルダ内にあればパスを書く必要なし。
my $outfile = "output.txt"; #同様に書き出しファイルの指定。
my @line; #配列の宣言。わざわざ要素の数を指定しなくても普通に使えるので便利です。
open(IN, $infile) || die; #読み込みファイルを「IN」という名前で開く。別に名前は何でもいいです。dieは開けなかった場合の処理。
open(OUT, ">$outfile") || die; #同様に書き出しファイルを開く。書き出すのでファイル名の前に「>」をつける?
while (<IN>){ #読み込みファイルにデータがある限り、1行ずつ取り出して処理する。取り出した文字列は"$_ "という変数に入ってます。
省略した書き方ですがこれで動くのでとても便利です。
chomp; #行末の改行文字を削除。"$_"は省略可。
s/\r//; #改行文字に\rが含まれている場合削除。最初のsは置換演算子。
@line = split(/,/); #"$_"中の文をカンマ(,)で区切って順番に配列@lineに入れる。
print OUT "$line[0]\t$line[2]\t$line[4]\r\n";
#"OUT"の名をつけたファイルに先ほど区切った配列の要素を書き出す。
配列は0から始まるので0,2,4番目の要素を書く。"\t"はタブ記号、"\r\n"は改行記号。
}
close(OUT); #それぞれのファイルを閉じる。
close(IN);
- 使用例その2:csvファイルのある列にどんな要素がいくつあるかをカウントする。
(例えばある列にA,A,B,C,B,B,Aがあると、A:3つ、B:3つ、C:1つというような)
use strict;
my $infile = "input.csv"; #読み込むファイル
my $outfile = "output.csv"; #書き出すファイル
my @tmp; #「@」は(普通の)配列
my %hash = (); #「%」は連想配列(ハッシュ?)、添え字として数字の変わりに好きな言葉などを使うことができる。
(つまりA[0]=30、A[1]=31のかわりにA["Sep"]=30、A["Oct"]=31のようにできる)
my $key;
my $retu = 4; #読み込む列を決める。(この場合5列目)
open(IN,$infile) || die "$infile: $!";
while (<IN>) {
chomp;
s/\r//;
@tmp = split(/,/);
if ($tmp[$retu] ne ""){ #その列の要素が空でない場合。
if (exists($hash{$tmp[$retu]})){ #その列の要素をキー値(添え字)として含む連想配列が存在する場合。
(つまり、その要素が前にも出ていてすでに連想配列のキー値として存在する場合)
$hash{$tmp[$retu]} += 1; #そのキー値に対応するハッシュの値を1増やす(カウントする)。
}else{ #それ以外の場合(初めて出てきた要素の場合)
$hash{$tmp[$retu]} = 1; #新しく配列の要素を作って1を入れる。
}
}
}
close(IN); #読み込み用のファイルを閉じる
open(OUT, ">$outfile") || die "$outfile: $!"; #書き出し用ファイルを開く
foreach $key (keys %hash){ #ハッシュのキー値を変数$keyに代入し、それをすべてのキー値に対して繰り返す
print OUT "$key,$hash{$key}\r\n"; #キー値(列の要素)とそのハッシュの値(要素の個数)を書き出す
}
close(OUT);
#以上です。わかりずらくてすいませんm(__)m