ec2でperlを動かそう

/var/www/cgi-bin

[ec2-user@ cgi-bin]$ ls
hello.cgi
[ec2-user@ cgi-bin]$ sudo chmod +x hello.cgi

#!/usr/bin/perl --
print "Content-type: text/html \n\n";
print "Hello";

きた

mysql
mysql> create database perldb;
Query OK, 1 row affected (0.02 sec)

mysql> use perldb;
Database changed
mysql> create table t1(
-> a int,
-> b varchar(10)
-> );
Query OK, 0 rows affected (0.04 sec)

mysql> insert into t1 values(1, ‘asakura’),(2, ‘adachi’),(3, ‘kobayakawa’);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> select * from t1;
+——+————+
| a | b |
+——+————+
| 1 | asakura |
| 2 | adachi |
| 3 | kobayakawa |
+——+————+
3 rows in set (0.01 sec)

$ perl hoge.pl
Can’t locate DBI.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at hoge.pl line 4.
BEGIN failed–compilation aborted at hoge.pl line 4.

sudo yum -y install perl-DBI perl-DBD-MySQL

きた!OKKKKKKKKKKKKKKKK

次はservlet mysqlだ。ここわなー

perlでmysqlからselectする(cgi編)

#!/usr/bin/perl --

use strict;
use DBI;

our $DB_NAME = "perldb";
our $DB_USER = "hoge";
our $DB_PASS = "hogehoge";
our $DB_HOST = "localhost";
our $DB_PORT = "3306";

my $dbh = DBI->connect("dbi:mysql:dbname=$DB_NAME;host=$DB_HOST;port=$DB_PORT","$DB_USER","$DB_PASS") or die "$!\n Error: failed to connect to DB.\n";
my $sth = $dbh->prepare("SELECT * FROM t1;");
$sth->execute();

print "Content-Type: text/html; charset=Shift_JIS\n\n";
while (my $ary_ref = $sth->fetchrow_arrayref) {
  print "<p>$ary_ref->[0], $ary_ref->[1]</p>\n";
}

$sth->finish;
$dbh->discconect;

なんや、OKだ。

次は、このままec2にperlを載せたい。

perlでmysqlからselectする(コマンドライン編)

#!/usr/bin/perl

use strict;
use DBI;

# MySQL
our $DB_NAME = "perldb";
our $DB_USER = "hoge";
our $DB_PASS = "hogehoge";
our $DB_HOST = "localhost";
our $DB_PORT = "3306";

my $dbh = DBI->connect("dbi:mysql:dbname=$DB_NAME;host=$DB_HOST;port=$DB_PORT","$DB_USER","$DB_PASS") or die "$!\n Error: failed to connect to DB.\n";
my $sth = $dbh->prepare("SELECT * FROM t1;");
$sth->execute();
while (my $ary_ref = $sth->fetchrow_arrayref) {
  my ($a, $b) = @$ary_ref;
  print "$a, $b\n";
}
$sth->finish;
$dbh->disconnect;

おおおおおおお、selectできるやんけ。
[vagrant@localhost cgi-bin]$ perl hoge.pl
1, asakura
2, adachi
3, kobayakawa
1, 1st

ということは、cgiも行けるかな(ワクワク)^^

Perl・MySQLのドライバーをインストールする

DBIモジュールとMySQLのDBDモジュールをインストール

[vagrant@localhost ~]$ sudo yum -y install perl-DBI perl-DBD-MySQL

mysql
create database perldb;
use perldb;
create table t1(
a int,
b varchar(10)
);

insert into t1 values(1, ‘asakura’),(2, ‘adachi’),(3, ‘kobayakawa’);
select * from t1;

use DBI;

$user = 'root';
$passwd = '';
$db = DBI->connect('DBI:mysql:perldb:localhost', $user, $passwd);
$sth = $db->prepare("INSERT INTO t1 VALUES (1,'1st')");
$sth->execute;
$sth->finish;
$db->disconnect;

mysql> select * from t1;
+——+————+
| a | b |
+——+————+
| 1 | asakura |
| 2 | adachi |
| 3 | kobayakawa |
| 1 | 1st |
+——+————+
4 rows in set (0.00 sec)

centosにcpanを入れる

今度こそ行けるかな?
$ sudo yum install cpan

これでいいですか? [y/N]y
パッケージをダウンロードしています:
(1/2): perl-CPAN-1.9402-144.el6.x86_64.rpm | 247 kB 00:00
(2/2): perl-Digest-SHA-5.47-144.el6.x86_64.rpm | 65 kB 00:00
——————————————————————————–
合計 128 kB/s | 312 kB 00:02

ほう。

cpanのupgrade
# perl -MCPAN -e shell
cpan[1]> o conf prerequisites_policy follow
cpan[2]> o conf commit
cpan[3]> upgrade

upgradeがやたら長いぞ。
なんだこれ、永遠と終わらんぞ。。

git hubからgit cloneします。
git clone https://github.com/PerlDancer/Dancer2.git

ここからどーするか。。

ルーティングのサンプルはいっぱいあるんだが、どこにファイルを置けばいいの?

cpan update

$ sudo cpan
cpan[1]> upgrade

$ cpan Dancer
Reading ‘/home/vagrant/.cpan/sources/authors/01mailrc.txt.gz’
………………………………………………………………….DONE
Reading ‘/home/vagrant/.cpan/sources/modules/02packages.details.txt.gz’
Database was generated on Tue, 11 Sep 2018 09:17:02 GMT
HTTP::Date not available
………….
New CPAN.pm version (v2.16) available.
[Currently running version is v2.00]
You might want to try
install CPAN
reload cpan
to both upgrade CPAN.pm and run the new version without leaving
the current session.

…………………………………………….Killed
あああああああああ、もうubuntuではできん。。centosでやろう。

perl dancer

なんだこりゃ、どうしろってんだ。。。


CPAN(シーパン、Comprehensive Perl Archive Network)とは、Perlのライブラリ・モジュールやその他のPerlで書かれたソフトウェアを集めた巨大なアーカイブで、世界中のサーバにその内容がミラーリングされている。再利用性・汎用性の高いモジュールが登録されており、Perlプログラマができるだけ車輪の再発明をせずに済むための支援環境となっている。登録モジュールの検索システムも提供されているため、Perlプログラマは望む機能を持ったモジュールを容易に入手することができる。

vagrant@vagrant-ubuntu-trusty-64:~/perl$ cpan Dancer
Reading ‘/home/vagrant/.cpan/sources/authors/01mailrc.txt.gz’
………………………………………………………………….DONE
Reading ‘/home/vagrant/.cpan/sources/modules/02packages.details.txt.gz’
Database was generated on Tue, 11 Sep 2018 09:17:02 GMT
HTTP::Date not available
Warning: Your system date is 1 days behind this index file!
System time: Mon Sep 10 07:24:39 2018
Timestamp index file: Tue, 11 Sep 2018 09:17:02 GMT
Please fix your system time, problems with the make command expected.

なんだと!
vagrant@vagrant-ubuntu-trusty-64:~/perl$ sudo ntpdate ntp.nict.jp
11 Sep 13:19:42 ntpdate[20614]: step time server 133.243.238.164 offset 107448.537336 sec
vagrant@vagrant-ubuntu-trusty-64:~/perl$ date
Tue Sep 11 13:21:24 UTC 2018

いいね~

vagrant@vagrant-ubuntu-trusty-64:~/perl$ cpan Dancer
Fetching with HTTP::Tiny:
http://ftp.jaist.ac.jp/pub/CPAN/authors/01mailrc.txt.gz
Reading ‘/home/vagrant/.cpan/sources/authors/01mailrc.txt.gz’
………………………………………………………………….DONE
Fetching with HTTP::Tiny:
http://ftp.jaist.ac.jp/pub/CPAN/modules/02packages.details.txt.gz
Reading ‘/home/vagrant/.cpan/sources/modules/02packages.details.txt.gz’
Database was generated on Tue, 11 Sep 2018 09:17:02 GMT
HTTP::Date not available
………….
New CPAN.pm version (v2.16) available.
[Currently running version is v2.00]
You might want to try
install CPAN
reload cpan
to both upgrade CPAN.pm and run the new version without leaving
the current session.

……………………………………………Killed

perlで正規表現

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

while(<$in>){
	$_ =~ s/abc/ABC/;
	print $_;
}

close($in);

vagrant@vagrant-ubuntu-trusty-64:~/app$ perl hello.pl
ABC
def
ghi
123
456

while(<$in>){
	$_ =~ s/abc/ABC/;
	if($_ =~ /[a-z]/){
		print $_;
	}	
}

なるほど、面白い
vagrant@vagrant-ubuntu-trusty-64:~/app$ perl hello.pl
def
ghi

サブルーチンをつくる。

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

サブルーチンという名称ですが、要するに関数ですな。

sub max {
	my $max = shift(@_);
	foreach(@_){
		$max = $_ if $_ > $max;
	}
	return $max;
}
print max(2, 8, 100, 23, 38);

vagrant@vagrant-ubuntu-trusty-64:~/app$ perl hello.pl
100

なんかかなり駆け足できましたが、基礎はこれ位にしてdancerに入りましょう。

perlでファイルの読み書きをしよう

fileをopenします。

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

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

close($in);

vagrant@vagrant-ubuntu-trusty-64:~/app$ cat test.dat
abc
def
ghi
123
456
789vagrant@vagrant-ubuntu-trusty-64:~/app$ perl hello.pl
abc
def
ghi
123
456
789

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

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

close($in);
close($out);

vagrant@vagrant-ubuntu-trusty-64:~/app$ perl hello.pl
vagrant@vagrant-ubuntu-trusty-64:~/app$ cat test.out
abc
def
ghi
123
456
789

書き込みですな。

ガンガンperlをやろう

# ループ処理
my $i = 0;
while($i < 10){
	print "i = $i\n";
	$i++;
}
&#91;/perl&#93;

vagrant@vagrant-ubuntu-trusty-64:~/app$ perl hello.pl
i = 0
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9

for文
&#91;perl&#93;
for(my $i = 0; $i < 10; $i++){
	print "i = $i\n";
}
&#91;/perl&#93;

おおおおおお、foreachが可笑しなことになってる。。
&#91;perl&#93;
my @colors = qw(red green blue orange pink);

foreach my $color (@colors){
	print "color = $color\n";
}
&#91;/perl&#93;

vagrant@vagrant-ubuntu-trusty-64:~/app$ perl hello.pl
color = red
color = green
color = blue
color = orange
color = pink

ナニコレ?
&#91;perl&#93;
my @colors = qw(red green blue orange pink);

foreach (@colors){
	print "color = $_\n";
}
&#91;/perl&#93;

vagrant@vagrant-ubuntu-trusty-64:~/app$ perl hello.pl
color = red
color = green
color = blue
color = orange
color = pink

これは。。。
&#91;perl&#93;
my %sales = ("tanaka"=>150, "suzuki"=>300, "ohira"=>200);

foreach my $key (keys(%sales)){
		print "sales for $key in $sales{$key}\n"
}

vagrant@vagrant-ubuntu-trusty-64:~/app$ perl hello.pl
sales for tanaka in 150
sales for suzuki in 300
sales for ohira in 200