Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発ならPerl
  1. Perl
  2. 基礎文法

Perl基礎文法最速マスター

ITの現場でPerlが必要になって、今勉強しているという方はおられませんか? 他の言語をある程度知っている方が「Perl基礎文法最速マスター」を読めば、Perlの使い方の基礎をマスターしてPerlを書くことができるようになっています。

基礎

文法チェック

文法をチェックを厳しくするために最初に必ず次の2行を書くようにします。

use strict;
use warnings;

use strict」と「use warnings」という2行を加えることで事前に文法チェックが行われるので、ソースコードを記述する作業は速くなり、コードの品質が上がります。

print関数

文字列を出力するにはprint関数を使用します。

print "Hello world";

Perlでは標準関数や事前に定義されている関数で括弧を省略することができます。

コメント

Perlのコメントです。

# コメント

変数の宣言

変数の宣言です。Perlの変数はmyを使って宣言します。変数にはスカラ変数、配列変数、ハッシュ変数があります。

# スカラ変数
my $num;

# 配列変数
my @students

# ハッシュ変数
my %month_num;

変数のスコープや寿命など、変数の詳しい解説については以下の記事をご覧ください。

スクリプトの実行

スクリプトを実行するにはコマンドラインで次のようにします。

perl script.pl

出力結果をファイルに書き出すにはリダイレクトを使います。

perl script.pl > file.txt

スクリプトを実行するためには、Windowsではコマンドプロンプトが必要です。コマンドプロンプトの使い方については以下の記事を参考にしてください。

コンパイルチェック

事前にコンパイルチェックを行うにはコマンドラインで次のようにします。

perl -c script.pl

デバッガの起動

Perlにはデバッガが標準でついています。デバッガを起動するにはコマンドラインで次のようにします。

perl -d script.pl

デバッガの詳しい使い方については以下を参考にしてください。

数値

数値の表現

スカラ変数に数値を代入できます。整数でも小数でも代入できます。桁数が大きい場合はアンダーバーを区切り文字として利用できます。

my $num = 1;
my $num = 1.234;
my $num = 100_000_000;

このような数値の表現を数値リテラルと呼びます。数値リテラルについての詳しい解説は以下の記事をご覧ください。

四則演算

四則演算です。

$num = 1 + 1;
$num = 1 - 1;
$num = 1 * 2;
$num = 1 / 2;

余りと商の求め方です。商を求めるには普通の除算を行った後にint関数で整数部を取り出します。

# 商
$div = int(3/2);

# 余り
$mod = 3 % 2;

四則演算についての詳しい解説は以下の記事をご覧ください。

インクリメントとデクリメント

インクリメントデクリメントです。

# インクリメント
$i++

# デクリメント
$i--

文字列

文字列の表現

文字列はシングルクォートかダブルクォートで囲みます。ダブルクォートの中では\t(タブ)や\n(改行)などの特殊文字を利用することができます。またダブルクォートで囲まれた文字列の中では変数展開することができます。

my $str1 = 'abc';
my $str2 = "def";
my $str3 = "a\tbc\n";

# 変数展開(結果は abc def)
my $str4 = "$str1 def";

文字列操作

各種文字列操作です。文字列を連結するドット演算子、join関数、文字列を分割するsplit関数、長さを取得するlength関数、文字列を置換するsubstr関数、検索するためのindex関数などがあります。

# 結合
my $join1 = 'aaa' . 'bbb';

my $join2 = join(',', 'aaa', 'bbb', 'ccc');

# 分割
my @record = split(/,/, 'aaa,bbb,ccc');

# 長さ
my $length = length 'abcdef';

# 切り出し
my $substr = substr('abcd', 0, 2); # ab

# 検索
my $result = index('abcd', 'cd'); # 見つかった場合はその位置、見つからなかった場合は-1が返る

配列

Perlの配列について簡単に説明します。

配列の宣言と代入

配列の宣言と代入です。配列は複数の値を代入することができる変数です。

# 配列の宣言
my @array;

# 配列への代入
@array = (1, 2, 3);

配列の要素の参照と代入

配列の要素を参照と代入です。

# 要素の参照
$array[0];
$array[1];

# 要素の代入
$array[0] = 1;
$array[1] = 2;

配列の個数

配列の個数を取得するには配列をスカラコンテキストで評価します。Perlにしか見られない少し特殊な文法です。

my $array_num = @array;

配列の操作

配列を操作する関数です。

# 先頭の要素を取り出す
my $first = shift @array;

# 先頭に要素を追加
unshift @array, 5;

# 末尾の要素を取り出す
my $last = pop @array;

# 末尾に要素を追加
push @array, 9;

配列の詳しい解説については以下の記事をご覧ください。

ハッシュ

Perlのハッシュについて簡単に説明します。

ハッシュの宣言と代入

ハッシュの宣言と代入です。ハッシュは複数の対になる値を代入することのできる変数です。

my %hash;
%hash = (a => 1, b => 2);

ハッシュの要素の参照と代入

ハッシュの要素の参照と代入です。

# 要素の参照
$hash{a};
$hash{b};

# 要素の代入
$hash{a} = 5;
$hash{b} = 7;

ハッシュのキーは「a-zA-Z_」で構成されている場合は、シングルクォートやダブルクォートで囲む必要はありません。

ハッシュに関する関数

# キーの取得
@keys = keys %hash;

# 値の取得
@values = values %hash;

# キーの存在確認
exists $hash{a};

# ハッシュのキーの削除
delete $hash{a};

ハッシュについて詳しい解説については以下の記事をご覧ください。

条件分岐

Perlの条件分岐の構文について解説します。

if文

if文です。

if (条件) {
    
}

if ~ else文

if ~ else文です。

if (条件) {
    
}
else {
    
}

if ~ elsif 文

if ~ elsif文です。

if (条件) {
    
}
elsif (条件) {
    
}

他の言語のようにelse ifではなくelsifであることに注意しましょう。

比較演算子

比較演算子の一覧です。Perlでは数値比較と文字列比較は厳密に区別されます。

[A]数値比較演算子の一覧

$p == $q $pと$qは等しい
$p != $q $pと$qは等しくない
$p < $q $pは$qより小さい
$p > $q $pは$qより大きい
$p <= $q $pは$q以下
$p >= $q $pは$q以上

[B]文字列比較演算子の一覧

$s eq $t $sは$tと等しい
$s ne $t $sは$tは等しくない
$s lt $t $sは$tより小さい
$s gt $t $sは$tより大きい
$s le $t $sは$t以下
$s ge $t $sは$t以上

Perlの条件分岐についての詳細な解説は以下を参考にしてください。

繰り返しの構文

Perlの繰り返しの構文について解説します。

while文

while文です。

my $i = 0;
while ($i < 5) {
    
    # 処理
    
    $i++;
}

for文

for文です。

for (my $i = 0; $i < 5; $i++) {
  ...    
}

foreach文

foreach文です。配列の各要素を処理できます。foreachはforのエイリアスになっており実質は同じものです。

foreach my $field (@fields) {
  ...
}

Perlの繰り返しの構文については、次の記事で詳細に解説しています。

サブルーチン

Perlでは関数のことをサブルーチンともいいます。サブルーチンを作るには次のようにします。

sub sum {
  my ($num1, $num2) = @_;
  
  my $total = $num1 + $num2;
  
  return $total;
}

Perlでは他の言語のように明示的に引数名を指定する必要はありません。@_という配列に引数が入っているので必要に応じて利用します。戻り値を返却するにはreturnを使用します。

サブルーチンの作成方法については以下の記事で詳しく解説しています。

ファイル入出力

ファイル入出力です。

open my $fh, '<', $file
  or die "Cannot open '$file': $!";

while (my $line = <$fh>) {
  ...
}

close $fh;

open関数でファイルをオープンすると、$fhにファイルハンドルが代入されます。'<'は読み込みモードです。書き込む場合は'>'とします。<$fh>という記述でファイルから一行読み込むことができます。or の後ははファイルオープンに失敗した場合に実行されます。dieはエラーメッセージを表示してプログラムを終了する関数です。$!はファイルオープンに失敗した場合のOSからのエラーメッセージです。

Perlのファイル入出力については、以下のページで詳しく解説しています。

知っておいたほうがよい文法

Perlでよく出てくる知っておいたほうがよい文法の一覧です。

Perlの真偽値

Perlの真偽値は次の定義です。Perlで偽と判断される値は、「undef」「''」「0」「'0'」の4種類です。これ以外は真になります。

defined 値が定義されているかどうかの判定

値が定義されているかどうかを調べるにはdefined関数を使用します。

defined $num;

コマンドライン引数

コマンドライン引数を受け取るには@ARGV変数を使用します。

my ($file, $options) = @ARGV;

コマンドライン引数をひとつだけ受け取る場合は次のように書くことができます。暗黙的に@ARGVがshiftの引数に渡されます。

my $file = shift;

スカラコンテキストとリストコンテキスト

Perlでは文脈によって戻り値が異なる関数があります。たとえばlocaltime関数などです。これはコンテキストと呼ばれるPerl特有の文法です。

# スカラコンテキスト(日付・時刻を文字列で取得)
my $time_str = localtime();

# リストコンテキスト(日付・時刻の各要素を配列として取得)
my @datetime = localtime();

unless文

unless文はif文の否定を表現します。

unless (条件) {
  ...    
}

後置のif, 後置のunless

Perlではifやunlessを文の後ろに置くことができます。

# 後置のif
print $num if $num > 3;

# 後置のunless
die "error" unless $num;

後置のfor

Perlではforを文の後ろに置くことができます。

# 後置のfor
print $_ for @nums;

値は順番に「$_」に代入されます。

配列スライスとハッシュスライス

配列スライスハッシュスライスを使うと指定した要素のみを配列として取得できます。

# 配列スライス
@select = @array[1, 4, 5];

# ハッシュスライス
@select = @hash{'a', 'b', 'd'};

map関数

map関数を使うと配列の各要素を変換することができます。$_には@arrayの要素が順に代入されます。

@mapped = map { $_ * 2 } @array;

grep関数

grep関数を使うと条件に一致した要素のみを配列として取得できます。$_ には@arrayの要素が順に代入されます。

@select = grep { $_ =~ 'cat' } @array;

リスト代入

リスト代入と呼ばれる代入方法があります。

my ($num1, $num2) = ($num3, $num4);

範囲演算子

整数の範囲を表現する範囲演算子と呼ばれるものがあります。

my @numes = (0 .. 5);

文字列リスト演算子

文字列のリストを簡単に書く文字列リスト演算子と呼ばれるものがあります。

my @strs = qw(aaa bbb ccc);

単独のreturn

サブルーチンの中でreturnと書くと、スカラコンテキストの場合はundefが返却され、リストコンテキストの場合は空のリスト()が返却されます。戻り値を使ってサブルーチンでエラーが発生したことを伝えたい場合はreturn undef とは書かないで return と書くようにします。

sub name {
  my @args = @_;
  
  return;
}

例外処理

例外を投げるにはdie関数を使用します。

die "Error message";

例外を捕獲するにはevalブロックを使用して$@を判定します。

eval { dieが発生する可能性のある関数など };

if ($@) {
  ...
}

ファイルからすべて読み込む

ファイルからすべて読み込む関数はないので行をすべて配列に読み込んでjoin関数でつなげます。

my @lines = <$fh>;
my $content = join('', @lines); 

これは一行で書けます。

my $content = join('', <$fh>);

3項演算子

3項演算子です。下のサンプルの場合は$flgが真値の場合は1が、偽値の場合は2が$numに代入されます。

my $num = $flg ? 1 : 2;

||=

左辺値が偽値の場合に右辺値を代入します。下のサンプルの場合は$numが偽値であった場合に2が$numに代入されます。

$num ||= 2; 

//=

Defined-or演算子です。左辺値が未定義の場合に右辺値を代入します。下のサンプルの場合は$numが未定義であった場合に2が$numに代入されます。

$num //= 2; 

モジュールの読み込み

モジュールを読み込むにはuseを使います。

use モジュール名;

Perlで設定ファイルを書く

Perlで書いた設定ファイルを読み込むにはdo関数を使用します。

my $conf_file = "app.conf";
my $conf = do $conf_file
  or die qq/Can't load config file "$conf_file": $!$@/;

設定ファイルの内容です。

{
  name => 'Foo',
  number => 9
}

ファイルの読み込みか解析に成功しなかった場合は未定義値が返却されます。ファイル名が存在しなかった場合は$!に、Perlのソースコードの読み込みに失敗した場合は$@にエラーの内容が設定されます。

複数行コメント

以下のように記述すると複数行コメントができます。

=pod

コメントにしたい文章

=cut
Qiitaで
「3分間Perlテキストクッキング」
という連載を始めました。
テキスト処理を題材にして、3分くらいで読める分量で、書いていきます。
文字コード、テキストデータ、コンピュータにおけるテキストの扱いなど、ソフトウェアの基礎の話題も
3分間Perlテキストクッキング