LotosLabo

プログラミング技術とか気になった情報を載せていきます

Perl言語について

f:id:lo25131:20140327175118j:plain

Perlとは


ラリー・ウォールによって開発されたプログラミング言語であり、テキスト処理から大規模なシステムまで開発でき、
かなり自由度が高い書き方が出来ます。


開発環境


公式サイトよりPerlをインストールします。

http://www.perl.org/get.html


OSに合わせたものがインストール可能です。
私はWindows環境でやるので、Strawberry Perlをインストールします。

バージョンはMore downloadsの方をおすすめします。

インストール方法は手順に沿って行けば大丈夫です。
環境変数の設定も特にいじらなければ自動でやってくれます。

エディタ

今回はエディタに Padre, the Perl IDEを使っていきます。
たぶんPerlで一番使われている、IDEだと思います。

http://padre.perlide.org/

こちらよりインストールできます。


Perlを始める


まずPerlを書く前にこの二行を必ず上に付けます。

use strict;
use warnings;

コレをつけることで文法のチェックや警告を出してくれます。



例としてHello Worldを出力します。

print "hello world\n";

最後にperlファイルとして保存します。

hello.pl 拡張子はplです。

f:id:lo25131:20140328003343j:plain


再生ボタンを押すと、コマンドプロンプトが立ち上がり、文字が表示されます。

f:id:lo25131:20140328003611j:plain


基本的な処理

出力

print "hello world\n";

コメント

#コメント

スカラー変数

変数:データにつけるラベル
データ(スカラー値、配列、ハッシュ)

スカラー => 単一の値:数値、文字列 

一文字目は必ず$をつける


例: 文字列

my $msg;
$msg = "hello world\n";
print $msg;


例: 数値

my $x = 10;
my $y = 10.5;
my $z = 123_235_345;  _は無視される


例: 演算 = + - / *

my $x = 10 * 10;
my $y = 10 % 3; 余り
my %z = 2 ** 3; べき乗


例:他の演算子 ++ -- +=

$x++;
$y--;
x +=5;


例:文字列を扱う

my $a = "heelo";
my $b = 'heelo';



特殊文字が使える、変数展開ができる
\n=> 改行 \t =>タブ



例:変数展開

my $name = "tom";
my $a = "hello,$name\n";
print $a;



""の中に$を使える


例:文字列の連結

print "hello" . "worlds";


例:連続出力

print "hello" x 5;



配列変数


複数の値を管理

@を使う

例:配列

my @sales = (150,200,300);
my @colors = ('red', 'green');
my @mixed = (150, 'red', 1.5);

print @sales;
print @colors;


例:範囲演算子

my @range = (1...100);
print @range;



1から100まで出力


例:qw文字列を使う

my @colors=qw(red green);
my @colors1=('red', 'green'); //このように代用できる
print @colors;
print @colors1;



配列の要素


例:

my @sales = (300,150,200);
print $sales[1]; // $マークに切り替える
print $sales[-1]; //末尾から数える


例:複数取る場合

my @sales = (300,150,200);
print @sales[0..1]; // 複数取るので @ を使う
print $#sales; // 末尾の数字を表現





ハッシュ変数

ハッシュ変数:キーと値 : %

例:

my %sales = ("lotos"=>300,"suzuki"=>150,"ohira"=>200);
print $sales{"lotos"};



数字が出力される




条件分岐


例: elseなし

my $score = 85;
if ($score >= 80){
	print("OK");
}


例: elseあり

my $score = 70;
if ($score >= 80){
	print("OK");
}else {
	print("not OK");
}


例: else if

my $score = 70;
if ($score >= 80){
	print("OK");
}else if($score >= 40){
	print("not OK");
}else{
	print("heavy");
}



比較演算子

数値にはこちらが使用できる

< >
== <=
>=
!=

文字列はこのような使い方ができる


eq(equal)
eq ne(not equal)
gt(greater than)
lt(less than)
ge(greater than equal)
le(less than equal)


例:

my $name = "luke";
if ($name eq "luke") {
	print("hahaha");
}


論理演算子

%% AND
|| OR
! NOT


例:

if(($name eq "Luke") && ($score >= 80)) {
	print ("hahaha");
}



if文の書き換えやif文の後置として使う


例: 置き換え

(条件) ? 値1 : 値2

my $a = 10;
my $b = 20;
my %max = (%a > %b) ? $a: %b;



例: 後置

my $score = 80;
print("OK") if($score >=70);



繰り返し


例:while

my $i = 0;
while ($i < 10){
 print "i = $i\n";
 $i++;
}



例:for

for (my $i = 0; $i < 10; $i++) {
	print "i = $i\n";



配列のループ


例:foreach

my @colors = qw(red green blue orange pink);
foreach my $color (@colors){
		print "color = $color\n";	
} 


しかしこれをループを使うことで省略することが出来ます。


例:第一段階省略

for my $color(@colors){
 print "color = $color\n";
}


例:第二段階省略

for(@colors){
 print "color=$_\n":
}



ハッシュのループ処理


例:

my %sales = ("tanaka"=>150, "suzuki"=>200, "ohira"=>300);
foreach my $key (keys(%sales)) {
	print "sales for $key is $sales{$key}\n";
}



例:省略形

for (keys %sales) {
	print "sales for $_ is $sales{$_}\n";
}


ファイルを扱う

<ファイルの入出力>

test.dat ファイルを用意します。

エラー処理には or die("")というのを使用します。


入力

open(my $in, "<", "test.dat") or die("could not open file");
while(<$in>) {
	print $_;
}
close($in);



出力

open(my $out, ">", "test.dat") or die("could not open file");

while(<$in>) {
	print $out $_;
}
close($out);




ファイルの内容を置き換えたりします。


例:

open(my $in, "<", "test.dat") or die("could not open file");

while (<$in>) {
	$_ =~ s/abc/ABC;    イコールチルダ  abc => ABCにする   // 置換
	if ($_ =~ /[a-z]/){ // aからxまで表示
	print $_;
	} 
}
close($in);




サブルーチン


例:

sub max {
	my $max = $_[0];
	if ($_[1] > $max) {
	$max = $_[1];
	}
	return $max;
}
print max(2,8);
return $max;