前回の
よくある質問への回答
ここでは、
変数名の左にある記号がコロコロ変わって理解できない
Perlには、$
、@
、%
がシジルとして変数名の前に付きます。同じ変数名であっても、
シジルが$
のスカラは、
シジルが@
の配列とシジルが%
のハッシュは、$
に変化します。サブルーチンの戻り値として配列を受け取るときは、@
の配列に代入します。ハッシュリファレンスをデリファレンスしたものは、%
のハッシュに代入します。
自分が操作したい対象を意識できると理解が進み、
配列とハッシュを使い分けられない
初学者であっても、
配列は、
array_sample.pl
# 配列によるデータ管理例:出席番号順生徒名簿
my @members = ('Alice', 'Bob', 'Carol', 'Dave');
# 順番に表示する
for my $member (@members) {
print "name: $member\n";
}
ハッシュは、
hash_sample.pl
# ハッシュによるデータ管理例:テストの成績管理
my %score = (Japanese => 75, English => 80);
# 英語の点数を表示
print "English score: $score{English}\n";
配列とハッシュそれぞれの特徴を把握すると、
初歩的文法を理解できているか不安
15年ほど前に話題になったFizzBuzz問題を解いてみましょう。
1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに
「Fizz」 と、 5の倍数のときは 「Buzz」 とプリントし、 3と5両方の倍数の場合には 「FizzBuzz」 とプリントすること。
── Jef Atwood著/
この問題を解くためには、if
文)、for
文)
fizzbuzz.pl
# 配列の使用
my @numbers = (1 .. 100);
# for文による繰り返し処理。変数へ値の格納
for my $num (@numbers) {
# if文による条件分岐処理
if ( $num % 3 == 0 && $num % 5 == 0 ) {
print 'FizzBuzz' . "\n";
} elsif ( $num % 3 == 0 ) {
print 'Fizz' . "\n";
} elsif ( $num % 5 == 0 ) {
print 'Buzz' . "\n";
} else {
print $num . "\n";
}
}
このFizzBuzz問題をスムーズに解ければ、
リファレンスを使う理由がわからない
受講生から、
Perlのスカラには1つの値しか代入できません。配列やハッシュの要素として、
リファレンスは、
data_struct.pl
# リファレンスを利用し、複雑なデータ構造を扱う
my %person1 = (
name => 'xtetsuji',
mail => '[email protected]'
);
my %person2 = (
name => 'sironekotoro',
mail => '[email protected]'
);
my %person3 = (
name => 'tomcha',
mail => '[email protected]'
);
my @people = ( \%person1, \%person2, \%person3 );
# 情報を一覧表示する
for my $person (@people) {
my $name = $person->{name};
my $mail = $person->{mail};
print "$name さんのメールアドレスは $mail です\n";
}
リファレンスを使う理由を理解し、
変数の中身が意図しない値になる
変数に格納された数値や文字列をコピーしてほかの変数へ渡した場合、
それに対してリファレンスをコピーしてほかの変数へ渡した場合、
値渡しと参照渡しの違いは、
reference_data_change.pl
# 値渡し時の挙動
my $number1 = 10;
my $number1_dup = $number1; # コピーを代入
$number1_dup *= 100;
print "もとのデータ: $number1\n"; # => 10
print "渡し先のデータ: $number1_dup\n"; # => 1000
# 参照渡し時の挙動
my $number2 = 10;
my $number2_ref = \$number2; # リファレンスを代入
$$number2_ref *= 100;
print "もとのデータ: $number2\n"; # => 1000
print "渡し先のデータ: $$number2_ref\n"; # => 1000
値渡し時のコードでは、$number1_
に加えた変更は、$number1
の値には影響しません。参照渡しのコードでは、$number2_
に加えた変更が、$number2
の値にも適用されます。
値渡しと参照渡しの特徴を理解して使い分けましょう。
エラーが発生したときはどうすればよいか
自分が書いたプログラムが思ったとおり動かないときはどうしたらよいのでしょうか。エラーが発生したときは、
エラーメッセージに書かれたことすべてを理解するのは難しいですが、
エラーメッセージを読んでみよう
次のコードでは、
double_money.pl
use strict;
use warnings;
my $money = 1;
for my $day (1 .. 31) {
$money *= 2 …(1)
print "$day 日後は $money 円\n"; …(2)
}
print "最終的に $money 円になりました\n";
ただし、
syntax error at double_money.pl line 7, near "print" Execution of double_money.pl aborted due to compilation errors.
エラーメッセージを読んでみましょう。
エラーメッセージの先頭に、syntax error
と書かれています。syntaxは日本語で構文を意味し、
続いて、at double_
と書かれています。これは、double_
に書かれたコードの7行目という意味です。Perlがコードを先頭から順に実行していった結果、
エラーの原因を見つけよう
7行目のprint
処理が書かれていますが、
そういうときは、$money *= 2
の後ろに文末に必要な;
が抜けていることがわかります。このため、syntax error
が出力されています。
英語を苦手とする人も多いですが、;
の書き漏れはよくあるミスなので注意してください。
コミュニティに参加しよう
プログラミングをゼロから学んでいくうえで、
各プログラミング言語にはユーザーによるコミュニティがあり、
コミュニティに参加することで、
- 大規模なカンファレンスに参加する楽しみが増える
- 運営スタッフとしてカンファレンスの裏側を知ることができる
- 技術系の執筆や、
登壇の機会が得られる - 転職についての情報が得られる
これらを体験・
もし自分が必要とする勉強会やコミュニティが見つからなければ、
Perl入学式に参加しよう
Perl入学式は、
Perl入学式のカリキュラムは、
また、
自分なりに頑張って勉強しても解決できないことはたくさんあります。筆者がPerl入学式の受講生としてプログラミングを学び始めたときは、
初学者でも安心して参加できるコミュニティで、
まとめ
Perlは現在でもサーバの保守運用業務の領域で役立つなど、
さて、
本誌最新号をチェック!
WEB+DB PRESS Vol.130
2022年8月24日発売
B5判/
定価1,628円
ISBN978-4-297-13000-8
- 特集1
イミュータブルデータモデルで始める
実践データモデリング
業務の複雑さをシンプルに表現! - 特集2
いまはじめるFlutter
iOS/Android両対応アプリを開発してみよう - 特集3
作って学ぶWeb3
ブロックチェーン、スマートコントラクト、 NFT