#!/usr/bin/env perl
use utf8;
use strict;
use warnings;
binmode STDIN, ":utf8"; # 標準入力
binmode STDOUT, ":utf8"; # 標準出力
binmode STDERR, ":utf8"; # 標準エラー出力
print "Hello World\n"; # Hello World[改行]
# 命令文の最後は「;」セミコロンを入力
# 「#」の後ろはコメントになる
# 「\n」は[改行]
print 'Hello World\n'; # Hello World\n
# シングルクォートの場合は「\n」がそのまま表示
print "はろーわーるど\n"; # 日本語もOK
my $string; # 「my」は変数の宣言
$string = '文字列'; # 「=」は右の値を左の変数に代入
print $string . "\n"; # 「.」は文字列の足し算(連結)
my $num = 123; # 変数の宣言と代入は同時でもOK
my $num2 = '123'; # 文字列として代入
my $sum = $num + $num2; # 「+」は数値の足し算
print "$num + $num2 は $sum です。\n"; # 答えは246
print "値を入力してください>>>";
my $input = <STDIN>; # 入力待ち
print "入力は $input です\n"; # [改行]を含む
chomp($input); # [改行]を取り除く
print "入力は $input です\n";
print "値2を入力してください>>>";
chomp( my $input2 = <STDIN> ); # 入力待ちと同時でもOK
# print "入力は$input2です\n"; # エラー
print "入力2は${input2}です\n"; # 変数名:$input2
print "入力1は${input}2です\n"; # 変数名:$input
print "値を入力してください>>>";
chomp( my $in = <STDIN> );
if ( $in == 0 ) {
# $in == 0 が「真」の場合
print "入力値${in}は0です\n";
}
else {
# $in == 0 が「偽」の場合
print "入力値${in}は0ではありません\n";
}
my $x = 123;
my $y = 123;
if ( $x == $y ) { print "$x と $y は同じ\n"; }
if ( $x != $y ) { print "$x と $y は違う\n"; }
if ( $x > $y ) { print "$x は $y より大きい\n"; }
if ( $x < $y ) { print "$x は $y より小さい\n"; }
if ( $x >= $y ) { print "$x は $y 以上\n"; }
if ( $x <= $y ) { print "$x は $y 以下\n"; }
my $result = $x <=> $y; # $x <=> $y の結果を代入
if ( $result == 0 ) { # 条件1
print "$x と $y は同じ\n";
}
elsif ( $result < 0 ) { # 条件2
print "$x は $y より小さい\n";
}
else { # すべての条件に当てはまらない
print "$x は $y より大きい\n";
}
print "値を入力してください>>>";
chomp( my $in = <STDIN> );
if ( $in eq 'a' ) {
# $in eq 'a' が「真」の場合
print "入力値${in}は'a'です\n";
}
else {
# $in eq 'a' が「偽」の場合
print "入力値${in}は'a'ではありません\n";
}
my $x = 'xyz';
my $y = 'xyz';
if ( $x eq $y ) { print "$x と $y は同じ\n"; }
if ( $x ne $y ) { print "$x と $y は違う\n"; }
if ( $x gt $y ) { print "$x は $y より大きい\n"; }
if ( $x lt $y ) { print "$x は $y より小さい\n"; }
if ( $x ge $y ) { print "$x は $y 以上\n"; }
if ( $x le $y ) { print "$x は $y 以下\n"; }
my $result = $x cmp $y; # $x cmp $y の結果を代入
if ( $result == 0 ) { # 条件1
print "$x と $y は同じ\n";
}
elsif ( $result < 0 ) { # 条件2
print "$x は $y より小さい\n";
}
else { # すべての条件に当てはまらない
print "$x は $y より大きい\n";
}
my $x = 1;
my $y = 2;
if ( $x == 1 && $y == 2 ) {
print "$x は 1 かつ $y は 2 です\n";
}
if ( $x == 2 || $y == 2 ) {
print "$x は 2 または $y は 2 です\n";
}
if ( ! $y == 1 ) {
print "$y は 1 ではありません\n";
}
my @array = ('a', 'b', 'c'); # 配列の宣言と代入
print "$array[0]\n"; # a[改行] : 最初の要素
print "$array[1]\n"; # b[改行] : 2つめの要素
print "$array[-1]\n"; # c[改行] : 最後の要素
print "@{array}\n"; # a b c[改行] : 中身を表示
print '@{array}\n'; # @{array}\n : 展開されない
my $array = @array; # スカラ変数と同じ名前でもOK
print "$array\n"; # 3[改行] : 配列の要素数
[]
(ブラケット)」を用いるmy @empty_array = ();
my @defined_only;
my @array = ('a', 'b', 'c');
push @array, '最後'; # 最後の要素に加える
unshift @array, '最初'; # 最初の要素に加える
print "@array\n"; # 最初 a b c 最後[改行]
my $pop = pop @array; # 最後の要素を取り出す
my $shift = shift @array; # 最初の要素を取り出す
print "@array\n"; # a b c[改行]
print "$pop\n"; # 最後[改行]
print "$shift\n"; # 最初[改行]
my @array = ('a', 'b', 'c');
my @array2 = reverse(@array); # 要素を逆並びにする
print "@array2\n"; # c b a[改行]
my @array3 = sort(@array2); # 要素を順序良く並べる
print "@array3\n"; # a b c[改行]
my $str = join(":", @array); # 要素を連結する
print "$str\n"; # a:b:c[改行]
my @array4 = split(/:/, $str); # 文字列を分割する
print "@array4\n"; # a b c[改行]
for my $i (1 .. 10) { # 1 から 10 まで
print "$i\n"; # 1[改行]2[改行]3[改行]...
}
my @array = ('a', 'b', 'c'); # 配列を定義
for my $item ( @array ) { # 配列の要素
print $item . "\n"; # a[改行]b[改行]
if ($item eq 'b') { # $itemが「b」という文字列の場合
last; # ループを抜ける(終了する)
}
}
my $perl = '嫌い';
my $like = '好き';
while ( $perl ne $like ) {
# 条件が真($perl と $like が違う)の場合はループ内へ
print "Perlは${like}ですか?[y/N]>>>";
chomp(my $in = <STDIN>);
if ( $in eq 'y' || $in eq 'Y' ) {
$perl = $like;
}
}
# 条件が偽の場合はループの外へ
print "Perlは${perl}ですよね〜。\n";
use List::Util qw(max min);
my @array = (2, 99, 87, 32, -11);
my $max = max(@array);
print $max . "\n"; # 99[改行]
my $min = min(@array);
print $min . "\n"; # -11[改行]
List::Util
」という配列関係の便利な関数が使えるモジュールを利用max
やmin
を使って書きなおしてみよう!CPAN(シーパン、Comprehensive Perl Archive Network)とは、Perlのライブラリ・モジュールやその他のPerlで書かれたソフトウェアを集めた巨大なアーカイブで、世界中のサーバにその内容がミラーリングされている。再利用性・汎用性の高いモジュールが登録されており、Perlプログラマができるだけ車輪の再発明をせずに済むための支援環境となっている。登録モジュールの検索システムも提供されているため、Perlプログラマは望む機能を持ったモジュールを容易に入手することができる。
$ cpanm LWP::UserAgent
$ cpanm Data::Dumper::Concise
$ cpanm --notest --force LWP::UserAgent
$ cpanm --notest --force Data::Dumper::Concise
$
はターミナルであることを表しています。コマンドの一部ではありませんuse LWP::UserAgent;
use URI;
my $ua = LWP::UserAgent->new;
$ua->agent('perl-entrance/0.04');
my $url = URI->new('http://ja.wikipedia.org/wiki/Perl');
my $res = $ua->get($url);
die $res->status_line unless $res->is_success;
my $html = $res->decoded_content;
print "$html\n";
perl-entrance/0.04
というユーザーエージェント名でhttp://ja.wikipedia.org/wiki/Perlにアクセス(getリクエスト)します。die
)します。use LWP::UserAgent;
# 「LWP::UserAgent」というモジュールを使用
use URI;
# 「URI」というモジュールを使用
use モジュール名
」とする$ perldoc モジュール名
」my $ua = LWP::UserAgent->new;
# $uaという変数を定義し、
# LWP::UserAgentのオブジェクトを作成
$ua->agent('perl-entrance/0.04');
# $uaの「ユーザーエージェント」の名称を変更
new
」は一般的にコンストラクタと呼ばれるメソッドですnew
」することによってオブジェクトが作られますmy $url = URI->new('http://ja.wikipedia.org/wiki/Perl');
# $urlという変数を定義し、URIのオブジェクトを作成。
my $res = $ua->get($url);
# $resという変数を定義
# $uaが$urlにアクセス(getリクエスト)し、
# その結果(レスポンス)を$resで受け取る
die $res->status_line unless $res->is_success;
# getリクエストが成功していなかったら(unlessはifの逆)
# エラー出力にステータスを表示して異常終了(die)
$res->is_success
」が「偽」の場合「die
」しますmy $html = $res->decoded_content;
# $htmlという変数を定義
# レスポンスの中身をPerlの内部形式にdecodeする
print "$html\n";
# レスポンスの中身を標準出力に出力
$res->decoded_content
」では、返り値がPerlの内部形式(文字列)で得られるmy $title;
if ( $html =~ /<title>(.*?)<\/title>/ms ) {
$title = $1;
}
else {
print "titleタグがありません。\n";
}
print "$title\n";
my $title;
if ( $html =~ /<title>(.*?)<\/title>/ms ) {
# このif文の中身は「マッチング」と言います
$title = $1;
# マッチングの際にカッコを用いると、
# その部分にマッチした文字列を利用できます
# $titleに先ほどの「.*?」にマッチした文字列を代入します
}
# (以下略)
~
」は「チルダ(Tilda)」と言いますmy $str = 'yes';
if ( $str =~ /y/ ) {
print "$str には「y」が含まれています\n";
}
else {
print "$str には「y」が含まれていません\n";
}
my $str = 'Yes';
if ( $str =~ /[yY]/ ) { # [...]の中身のいずれか1文字にマッチ
print "$str には「y」または「Y」が含まれています\n";
}
if ( $str =~ /y/i ) { # iオプションは大文字小文字を無視してマッチ
print "$str には「y」または「Y」が含まれています\n";
}
.
」は、「\n
」以外の任意の1文字にマッチ*
」は、直前の文字の0回以上の繰り返しにマッチ?
」は、直前の文字、または、空文字列にマッチmy $str = "<title>1<title>2</title>3</title>";
$str =~ /<title>(.)<\/title>/;
print "1番目のマッチ:$1\n"; # 2
$str =~ /<title>(.*)<\/title>/;
print "2番目のマッチ:$1\n"; # 1<title>2</title>3
$str =~ /<title>(.*?)<\/title>/;
print "3番目のマッチ:$1\n"; # 1<title>2
*?
」は、なるべく短くマッチする(最短マッチ).*?
」とは「\n以外の任意の文字になるべく短くマッチ」したい場合に使用する$str =~ /<title>(.)<\/title>/;
\
(バックスラッシュ)」はエスケープ文字\/
」はスラッシュをエスケープしている$str =~ m!<title>(.)</title>!;
$str =~ m|<title>(.)</title>|;
$str =~ m"<title>(.)</title>";
$str =~ m{<title>(.)</title>};
/
」)は、「m
」を用いると他の文字に変更できるmy $delimiter = 'デリミタ';
my $str = "通常は\"のようにエスケープします。\n";
$str .= qq|qqを使うとエスケープ"なし"で大丈夫。\n|;
# ダブルクォート同等
$str .= qq{変数(${delimiter})も展開されます。\n};
$str .= q!qだけの場合は、変数(${delimiter})や\nも展開されません。!;
# シングルクォート同等
$str .= q|ただし、デリミタの文字(\|)を使う場合はエスケープが必要です。|;
print "$str\n";
my $str = "<div class=\"apple\">iPhone</div>\n";
my $str = qq{<div class="apple">iPhone</div>\n};
$str .= 'str';
# ↓と同じ意味
$str = $str . 'str';
my %nqounet; # 最初に「%」をつける
$nqounet{'name'} = 'Nobutaka Wakabayashi';
$nqounet{'born'} = '石川県';
print "$nqounet{'name'}\n";
print "$nqounet{'born'}\n";
{}
(ブレース、中括弧)」を用いるmy %hash1 = ('one', 'two', 'three', 'four');
my %hash2 = ('1', '2', '3', '4');
print "%hash1\n"; # %hash1[改行]
print %hash1; # threefouronetwo
print "\n";
print %hash2; # 1234
print "\n";
my %hash = (
'key1' => 'value1', # '=>'はファットカンマ
key2 => 'value2', # ほぼ「,(カンマ)」と同じ意味
# 左側の値を文字列として解釈するので、クォートしなくてもよい
);
print "$hash{key1}\n"; # value1[改行]
print "$hash{'key2'}\n"; # value2[改行]
my @nqounet = (
'nqounet',
'38',
'Perl',
);
print "twitter : $nqounet[0]\n";
print "age : $nqounet[1]\n";
print "lang : $nqounet[2]\n";
my %nqounet = (
twitter => 'nqounet',
age => '38',
lang => 'Perl',
);
for my $key ('twitter', 'age', 'lang') {
print "$key : $nqounet{$key}\n";
}
my %nqounet = (
twitter => 'nqounet',
age => '38',
lang => 'Perl',
);
while ( my ($key, $value) = each %nqounet ) {
# 「each」はハッシュのキーと値をペアで返す
# whileを組み合わせて、すべての中身が確認できる
print "$key : $value\n";
}
each
」はハッシュのキーと値をペアで返すuse Data::Dumper::Concise; # Dumperという関数を生成
my %nqounet = (
twitter => 'nqounet',
age => '38',
lang => 'Perl',
);
print Dumper( \%nqounet );
# 変数の前に「\(バックスラッシュ)」をつける(解説は後ほど)
use Data::Dumper::Concise;
my @mails = (
'nobu at nishimiyahara.net',
'coworking at shin-osaka.in',
);
my @webs = (
'http://nqou.net',
'http://www.nishimiyahara.net',
'http://www.shin-osaka.in',
);
my %nqounet = (
name => 'nqounet',
mail => @mails,
web => @webs,
);
print Dumper \%nqounet;
# 結果
{
"coworking at shin-osaka.in" => "web",
"http://nqou.net" => "http://www.nishimiyahara.net",
"http://www.shin-osaka.in" => undef,
mail => "nobu at nishimiyahara.net",
name => "nqounet"
}
my @nqounet = ( # 「%」 を 「@」 に変更してみる
name => 'nqounet',
mail => @mails,
web => @webs,
);
print Dumper \@nqounet; # 「%」 を 「@」 に変更してみる
# 配列の場合も変数の前に「\(バックスラッシュ)」をつける(解説は後ほど)
# 結果
[
"name",
"nqounet",
"mail",
"nobu at nishimiyahara.net",
"coworking at shin-osaka.in",
"web",
"http://nqou.net",
"http://www.nishimiyahara.net",
"http://www.shin-osaka.in"
]
my %nqounet = ( # 「@」 を 「%」 に戻す
name => 'nqounet',
mail => \@mails, # 変数の前に「\」をつける
web => \@webs, # 変数の前に「\」をつける
);
print Dumper \%nqounet; # 「@」 を 「%」 に戻す
# 結果
{
mail => [
"nobu at nishimiyahara.net",
"coworking at shin-osaka.in"
],
name => "nqounet",
web => [
"http://nqou.net",
"http://www.nishimiyahara.net",
"http://www.shin-osaka.in"
]
}
for my $key ( keys %nqounet ) {
print "$key : $nqounet{$key}\n";
}
# 結果(0x...の部分は違う場合もあります)
web : ARRAY(0x7fe5108275e8)
name : nqounet
mail : ARRAY(0x7fe510827648)
$nqounet{mail}
」や「$nqounet{web}
」の値は「リファレンス」と呼びます\
(バックスラッシュ)」をつけますmy $scalar = 'string';
my @array = ('a', 'b', 'c');
my %hash = (key1 => 'value1', key2 => 'value2');
my $scalar_ref = \$scalar; # スカラーのリファレンス
my $array_ref = \@array; # 配列のリファレンス
my $hash_ref = \%hash; # ハッシュのリファレンス
my $scalar_ref_direct = \'Perl';
my $array_ref_direct = +['d', 'e', 'f'];
# 「+」は省略可能
my $hash_ref_direct = +{ key => 'value' };
# 「+」は省略可能
# 「$nqounet{mail}」は配列のリファレンス
for my $mail ( @{$nqounet{mail}} ){
# リファレンスを「@{...}」で囲う
print "$mail\n";
}
my $scalar = 'string';
my $scalar_ref = \$scalar; # スカラーのリファレンス
print ${$scalar_ref};
my @array = ('a', 'b', 'c');
my $array_ref = \@array; # 配列のリファレンス
print join("\n", @{$array_ref}); # 配列全体をデリファレンス
print $array_ref->[0]; # 配列のリファレンスの最初の要素
print $array_ref->[1]; # 配列のリファレンスの2つめの要素
print $array_ref->[-1]; # 配列のリファレンスの最後の要素
my %hash = ( key1 => 'value1', key2 => 'value2' );
my $hash_ref = \%hash;
# ハッシュのリファレンス
for my $key ( keys %{$hash_ref} ) {
# ハッシュ全体をデリファレンス
print "$key : $hash_ref->{$key}\n";
# ハッシュの要素を表示する
}
my @mails = (
'nobu at nishimiyahara.net',
'coworking at shin-osaka.in',
);
my @webs = (
'http://nqou.net',
'http://www.nishimiyahara.net',
'http://www.shin-osaka.in',
);
my %nqounet = (
name => 'nqounet',
mail => \@mails,
web => \@webs,
);
print $nqounet{web}->[2]; # http://www.shin-osaka.in
# %nqounetの「web」というキーの値が配列のリファレンス
# その配列のリファレンスをデリファレンスした3番目の値
print $nqounet{mail}->[0]; # nobu at nishimiyahara.net
# %nqounetの「mail」というキーの値が配列のリファレンス
# その配列のリファレンスをデリファレンスした最初の値
my %papix = (
name => 'papix',
mail => [], # 空の配列のリファレンス
web => ['http://papix.net'], # 配列のリファレンス
);
my $perl_entrance = { # ハッシュのリファレンス
old_type => \%nqounet,
new_type => \%papix,
};
print $perl_entrance->{new_type}->{web}->[0];
# http://papix.net
print $nqounet{web}->[2];
print $nqounet{web}[2];
# ブレースとブラケットの間の矢印は省略できる
print $perl_entrance->{new_type}->{web}->[0];
print $perl_entrance->{new_type}{web}[0];
# ブレース同士、ブラケット同士も同じ
print $perl_entrance{new_type}{web}[0]; # エラー
# %perl_entranceというハッシュの「new_type」をキーとする値を参照している
my $str = 'これは文字列です';
my $num = 123;
print "文字列( $str )と数値( $num )\n";
my @array = ('a', 'b', 'c');
print "$array[0]\n";
print "@{array}\n";
for my $item ( @array ) {
print "$item\n";
}
my %hash = (
key1 => 'value1',
key2 => 'value2',
);
print "key1 : $hash{key1}\n";
for my $key ( keys %hash ) {
print "$key : $hash{$key}\n";
}
my $array_ref = +['a', 'b', 'c']; # 「+」は省略可能
print "$array_ref->[0]\n";
print "@{$array_ref}\n";
for my $item ( @{$array_ref} ) {
print "$item\n";
}
my $hash_ref = +{ # 「+」は省略可能
key1 => 'value1',
key2 => 'value2',
};
print "key1 : $hash_ref->{key1}\n";
for my $key ( keys %{$hash_ref} ) {
print "$key : $hash_ref->{$key}\n";
}
{
luigi => {
color => "green",
initial => "L"
},
mario => {
color => "red",
initial => "M"
}
}
Use a spacebar or arrow keys to navigate