Perl再入門の最近のブログ記事
PerlでDBIモジュールを使ってDB操作を行うためのかんたんなサンプルコードです。
「都道府県マスタ」テーブルを作って、CRUD(レコード追加、読み取り、変更、削除)を行います。
注:
「都道府県マスタ」テーブルを作って、CRUD(レコード追加、読み取り、変更、削除)を行います。
注:
- コマンドラインから実行することを想定しています。
- ユーザ名、パスワード、DB接続情報などは環境に合わせて変更してくださいね。
- サンプルではMySQLを使用していますが、他のRDBMSにも使えると思います。
#!/usr/bin/perl
use strict;
use warnings;
use DBI;
my $user = 'username';
my $passwd = 'pass';
my $host = 'localhost';
my $dbname = 'mysample';
my $dbh = DBI->connect("DBI:mysql:$dbname:".$host, $user, $passwd);
my $sql;
my $sth;
# CREATE TABLE
$sql = "CREATE TABLE prefmaster ( id INT , name VARCHAR(255) ) ";
$dbh->do($sql);
# INSERT
$sql = " INSERT INTO prefmaster (id,name) values (1, 'hokkaido') ";
$dbh->do($sql);
$sql = " INSERT INTO prefmaster (id,name) values (2, 'akita') ";
$dbh->do($sql);
# SELECT
$sql = "SELECT * FROM prefmaster";
$sth = $dbh->prepare($sql);
$sth->execute;
print "SELECT\n";
while(my @a = $sth->fetchrow_array){
print "@a\n";
}
print "\n";
# UPDATE
$sql = " UPDATE prefmaster SET name = 'iwate' WHERE id = 2 ";
$dbh->do($sql);
# DELETE
$sql = " DELETE FROM prefmaster WHERE id = 1 ";
$dbh->do($sql);
# SELECT AGAIN
$sql = "SELECT * FROM prefmaster";
$sth = $dbh->prepare($sql);
$sth->execute;
print "SELECT\n";
while(my @a = $sth->fetchrow_array){
print "@a\n";
}
print "\n";
# DROP TABLE
$sql = " DROP TABLE prefmaster ";
$dbh->do($sql);
$sth->finish;
$dbh->disconnect;
ソースコードをUTF8で書いて、print文をUTF8で出力したい場合。
自分でもよく忘れるのでメモ。
#!/usr/bin/perl
use strict;
use warnings;
use utf8; # このスクリプトはUTF8で書かかれていますよ、という宣言
binmode STDOUT, ":encoding(utf8)"; # 以下のPrint文を自動的にUTF8として出力せよ、という命令
my $str ="あいうえお\n";
print substr($str,2,1)."\n;" # 'う' と出力される。
Perlでは、サブルーチンへのリファレンスを作って変数に格納することができます。
例
use strict;
sub greets {
print "hello\n";
}
my $ref = \&greets;
この例では、greetsサブルーチンへのリファレンスを、$refに格納しています。デリファレンス
$refをデリファレンスして元のサブルーチンを呼び出す方法まずおさらい。
普通のサブルーチン呼出はこう書きます。
&greets(); # → hello ここで、
サブルーチン名 → {$ref}
と置き換えると、
$refをデリファレンスして元のサブルーチンを得ることができます。
&{ $ref }(); # → hello
デリファレンスの省略記法
下記のコードはすべて同じ動作をします。
&{$ref}();
&$ref();
$ref->();
無名配列コンストラクタ [ ] を使って、ネストされたリファレンスを作ることができます。
例1
my $ref = [ [ 1, 2, 3 ] , [ 2, 4, 6 ] ] ;これは、次のコードと同じような働きをします。
例2
my @array1 = ( 1, 2, 3 );
my @array2 = ( 2, 4, 6 );
my @array_all = ( \@array1, \@array2 );
my $ref = \@array_all;
デリファレンス
値を取り出すときはデリファレンスします。print $ref->[1]->[1]; # 出力 4
または
print $ref->[1][1]; # 出力 4
2次元配列
上の例を見ると、2次元配列によく似ていることがわかると思います。
Perlではこのようにして2次元配列を実現します。
もちろん、ネストを重ねれば多次元配列を作れます。
例1
my $ref = [ 2, 4, 6 ];
これは、下記と同じような働きをします。例2
my @array = ( 2, 4, 6 );
my $ref = \@array;
例2での@arrayに相当する中間変数が、例1にはありません。
このとき例1の$refには、「名前の無い配列」へのリファレンスが格納されています。
[ 2, 4, 6 ]における [ ]のことを
無名配列コンストラクタ
といいます。
参考: Perl再入門 | アルパカ本に学ぶリファレンス入門4 - 無名配列