○perl 簡易リファレンス

実行方法
引数を受け取る
標準出力
標準入力
コメントは#で始まる行
変数は $で始まる文字列
計算
文字の連結
文字のサイズを求める
文字列の切り出し
文字列の最後の改行文字を削除
コマンドライン引数は$ARGV配列に入っています
区切り文字による文字列の切り分け
配列
連想配列
条件式
比較演算子
繰り返し
ソート
GOTO文
サブルーチン
環境変数
他のプログラムの実行
スクリプトファイルの結合
複数行に渡る文字列








■実行方法
Perlがインストールされているとする

テキストファイルにPerlスクリプトを書く
****.pl という拡張子で保存する

▼実行するには
perl ****.pl

■スクリプトの改行は ;


■引数を受け取る

$ARGV[0];
上記変数に1つ目の引数が格納されます
以降 1 2 と続きます

$ARGV[1];
$ARGV[2];


■標準出力
print
もしくは C言語と同様に使える
printf

$val=10.1;
printf("%d\n",$val);
printf("%g\n",$val);

出力結果
10
10.1

▼printfの内容を変数に出力

$str=sprintf('%dです',10);
print $str;

■標準入力

$line=<>;#文字が一行入力されるまで待機
print $line;


while($line=<>){}にすると$lineがEOFになるまでループする。

例)標準入力からの文字列を""で囲んで標準出力する

while($line=<>){
  $line =~ s/\r//;    #改行を削除する
  $line =~ s/\n//;    #改行を削除する
  print "\"$line\"\n";  #""で囲って出力する
}


■コメントは#で始まる行

#ココはコメント

■変数は $で始まる文字列
変数の型は無いし宣言の必要も無い

$str="test";
$val=10;
print $str;
print "\n";
print $val;

出力結果

test
10

■計算
数字の文字も自動で数字に変換されて計算

$a="10";#文字
$b="20.01";#文字
$c=30.0002;#数字
$e=$a+$b+$c;
print $e;

出力結果

60.0102

▼小数点以下切捨て
int関数を使う

$a=int(1/3);

■文字の連結

$a="10";#文字
$b="20.01";#文字
$c=30.0002;#数字
$d="test";#文字
$e="$a$b$c$d";
print $e;

出力結果

1020.0130.0002test

■文字のサイズを求める

$str="test";
print length($str);

出力結果
4

■文字列の切り出し

▼位置を指定して切り出し

$str="abcdef";
print substr($str,2,3);# 文字列の2文字目から3文字を切り出し

出力結果
cde


▼区切り文字による切り出し
カンマを区切り文字として文字列を切り出し、配列に格納します

$str="aaaa,bbbb,cccc,dddd";
@ar = split(/,/, $str);
printf("%s %s %s %s\n",$ar[0],$ar[1],$ar[2],$ar[3]);

出力結果
aaaa bbbb cccc dddd


▽区切り文字で切り出された配列をループで出力します

$str="aaaa,bbbb,cccc,dddd";
@ar = split(/,/, $str);
for($i=0;$i<@ar;$i++){
  printf("%s\n",$ar[$i]);
}

出力結果
aaaa
bbbb
cccc
dddd


■文字列の最後の改行文字を削除

$str="abcdef\n";
chomp($str); #最後の改行文字を削除
print $str;

しかし、上記方法だとWindowsで作成されたテキストの場合において、
改行文字が完全に削除されない。
(Linuxでの改行文字はLFであるが、Windowsでの改行文字は CR+LF のため、
CRが削除されない)
そのため以下の方法がおすすめである

$str =~ s/\r//;    #CRを削除する
$str =~ s/\n//;    #LFを削除する



■コマンドライン引数は$ARGV配列に入っています

print $ARGV[0];
print "\n";
print $ARGV[1];

■区切り文字による文字列の切り分け
カンマ区切り文字を切り分けます

$str="aa,bb,c";
@ar=split( ',' , $str );
print $ar[0],"\n";
print $ar[1],"\n";
print $ar[2],"\n";

処理結果
aa
bb
c

■配列

配列は @ で始まる文字列になります
▼値で初期化した配列

@ar=(10,20,30,40);
print $ar[0],"\n";
print $ar[1],"\n";
print $ar[2],"\n";
print $ar[3],"\n";

実行結果
$ perl test.pl
10
20
30
40

▼要素数の表示
配列の数を取得できます

@ar=(10,20,30,40);
$len=@ar;
print $len;

実行結果
$ perl test.pl
4

▼値を取り出して変数への格納
配列に格納されている順番に変数に格納されます

@ar=(10,20,30,40);
($a,$b)=@ar;

print "$a\n";
print "$b\n";

実行結果
$ perl test.pl
10
20

▼末尾に値を追加
配列の最後に値が追加されます

@ar=(10,20,30,40);
push @ar,50;

print $ar[0],"\n";
print $ar[1],"\n";
print $ar[2],"\n";
print $ar[3],"\n";
print $ar[4],"\n";

実行結果

$ perl test.pl
10
20
30
40
50

▼先頭に値を追加
配列の先頭に値が追加されます

@ar=(10,20,30,40);
unshift @ar,50;

print $ar[0],"\n";
print $ar[1],"\n";
print $ar[2],"\n";
print $ar[3],"\n";
print $ar[4],"\n";

実行結果

$ perl test.pl
50
10
20
30
40

▼配列の要素を削除
splice (配列,位置,要素数)
次のプログラムでは2番目の要素を1つ削除します

@ar=(10,20,30,40);
splice @ar,2,1;
print $ar[0],"\n";
print $ar[1],"\n";
print $ar[2],"\n";
print $ar[3],"\n";
print $ar[4],"\n";

実行結果

$ perl test.pl
10
20
40

次のプログラムでは2番目の要素を2つ削除します

@ar=(10,20,30,40);
splice @ar,2,2;
print $ar[0],"\n";
print $ar[1],"\n";
print $ar[2],"\n";
print $ar[3],"\n";
print $ar[4],"\n";

実行結果

$ perl test.pl
10
20

▼配列の結合
配列自体を結合します

@ar1=(10,20);
@ar2=(30,40);
@ar=(@ar1,@ar2);
print $ar[0],"\n";
print $ar[1],"\n";
print $ar[2],"\n";
print $ar[3],"\n";

実行結果

$ perl test.pl
10
20
30
40

▼配列の要素の結合
配列の要素を一つの文字列に結合できます
join 区切り文字,配列
要素と要素の区切り文字も指定できます

@ar=(10,20,30,40);
$str=join ",",@ar;
print $str;

実行結果

$ perl test.pl
10,20,30,40

▼配列のクリア
配列の要素が全て削除されます

@ar=(10,20,30,40);

@ar=();

print $ar[0],"\n";
print $ar[1],"\n";
print $ar[2],"\n";
print $ar[3],"\n";

実行結果

$ perl test.pl





▼配列の複製

$ar[0]=10;
$ar[1]=20;
$ar[2]=30;
$ar[3]="test";

@ar2=@ar;#配列の複製 値がすべて複製される

$ar[3]="test2";//元の配列の値を変えても値渡しのため結果に影響しない

print $ar2[0],"\n";
print $ar2[1],"\n";
print $ar2[2],"\n";
print $ar2[3],"\n";

出力結果

10
20
30
test

▼配列の列挙

-----------その1-----------

@files = <*.txt>;#ワイルドカードに当てはまるファイル名を配列で取得

#配列の値を列挙
foreach ( @files ) {
  $file=$_;
  print $file,"\n";
}

-----------その2-----------

@files = <*.txt>;

$size=@files;#配列のサイズを求める

for($i=0;$i<$size;$i++){
  print $files[i];
}

■連想配列

$map{"aa"}="aaです";
$map{"bb"}="bbです";
$map{"cc"}="ccです";
$map{"dd"}="ddです";
$map{"ee"}="eeです";
$map{"ff"}="ffです";

print $map{"cc"};

処理結果
ccです

■条件式

▼if文の書き方は基本的にはCやJAVAと同じですが
"else if" の場合のみ書き方が "elsif" に変わるため注意が必要です

if(式){

}elsif(式){

}

▼数字の場合は 0 はFALSEとなる

if(0){
  print "成立";
}else{
  print "不成立";
}

処理結果
不成立

if(-1){
  print "成立";
}else{
  print "不成立";
}

処理結果
成立

▼文字の場合は "" 空白文字列はFALSEとなる

if("a"){
  print "成立";
}else{
  print "不成立";
}

処理結果
成立

if(""){
  print "成立";
}else{
  print "不成立";
}

処理結果
不成立

■比較演算子

▼文字の比較
equals
print "a"eq"a"; #文字列比較 出力は"1"
print "a"eq"b"; #文字列比較 出力は""

not equals
print "aaa"ne"aaa"; #文字列比較 出力は""
print "aaa"ne""; #文字列比較 出力は"1"

▼数字の比較(Cと同じです)
print 10==10; #数字の比較 出力は"1"
print 10==20; #数字の比較 出力は""

▼論理演算し(Cと同じです
print 10==10 && 2==0; #論理演算子 出力は""
print 10==10 || 2==0; #論理演算子 出力は"1"

■繰り返し
▼while文

while (論理式) {
}

last;にてwhileを終了させることが出来ます

▼for文

for (初期化;論理式;繰り返しごとに実行) {
}

▼例

for($a=0;$a<10;$a++){
  print $a;
}

出力結果
0123456789

■ソート

$ar[0]=10;
$ar[1]=1;
$ar[2]=3;
$ar[3]=20;

#ソートは内部的に 数値$a $b を使用する <=>は比較演算子
#{$b <=> $a} に変更すると逆順ソートになる
@ar =sort {$a <=> $b} @ar;

print $ar[0],"\n";
print $ar[1],"\n";
print $ar[2],"\n";
print $ar[3],"\n";

出力結果
1
3
10
20

■GOTO文

print "a";
goto c;
print "b";
c:
print "c";

処理結果
ac

■サブルーチン

▼全ての変数がグローバルなためスコープが効きません
$a=10;
&test("aa","bb");
print $a;

sub test{
  $a=@_[0];
  $b=@_[1];
  print $a;
  print $b;
}

処理結果
aabbaa

▼ローカル変数を作成したサブルーチン

$a=10;
&test("aa","bb");
print $a;

sub test{
  local($a)=@_[0];
  local($b)=@_[1];
  print $a;
  print $b;
}

処理結果
aabb10

▼ポインタ渡し

$a=10;
&test(*a);
print $a;

sub test{
  local(*b)=@_[0];
  $b=20;
}

処理結果
20

■環境変数

$str = $ENV{PATH};
print $str;

■他のプログラムの実行

system("notepad.exe");

■スクリプトファイルの結合

ファイル名 test.pl -----------------------

$str="test.pl";

ファイル名 start.pl ----------------------

require "test.pl";
print $str;

-------------------------------------

start.plの実行の処理結果
test.pl


■複数行に渡る文字列

$str = <<KEYWORD;
aaa
bbb
ccc
ddd
\"'^-=!
KEYWORD

print $str;


▲<<KEYWORD;からKEYWORDに囲まれた複数行が一つの文字列として
扱われ、変数$strに複数行の文字列が代入されます
(KEYWORDは任意の文字列であり、自由に変更できます)

上記プログラムを実行すると
$ perl test.pl
aaa
bbb
ccc
ddd
"'^-=!
複数行の文字列が代入されていることが確認できます

次に複数行の文字列を直接出力してみます
上記プログラムと同じようにprint文に複数文字を渡しています

print <<TEST;
test
test
test
TEST

上記プログラムの実行結果
$ perl test.pl
test
test
test
複数行が出力されていることが確認できます

▲トップページ > perl 関連