Perl Scalars

Perl has three basic data types: scalars, scalar arrays, and scalar associative arrays. In this context, scalar data refers to simple data such as numbers and strings. Also, as an essential element of programming, there is the concept of variables. Variables are “value containers” that are used to temporarily store various values.
In Perl, there are three variables, scalar variable, array, and associative array respectively, in the form corresponding to each data type, and the scalar variable is the most basic one among them, and stores numerical value and character string can do.
Scalar variable names can start with $ (dollar) + one alphabetic character, and can use numbers, alphabetic characters and underscores thereafter. Also, because it is cause sensitive, $ a and $ A, for example, are treated as different things.

OK
$abc123
$abc_123

NG
$123abc
$abc-123

Perlで日付を表示

Time::Pieceを使う方法

#!/usr/bin/perl --
use Time::Piece;

my $t = localtime;
print $t->ymd;

上手くいかない。。

unixのdateコマンドを使用

#!/usr/bin/perl --

print qx(date "+%Y/%m/%d %H:%M:%S");

ちゃんと表示はされます。

2019/04/02 09:00:25

#!/usr/bin/perl --

my ($sec, $min, $hour, $mday, $mon, $year) = (localtime(time))[0..5];
print "Content-type:text/html\n\n";
printf("%d/%02d/%02d %02d:%02d:%02d\n", $year + 1900, $mon + 1, $mday, $hour, $min, $sec);

こちらも行けますねー

DBIで、mysqlにinsert

mysql> create table name(
-> name varchar(255),
-> password varchar(255)
-> );
Query OK, 0 rows affected (0.07 sec)

#!/usr/bin/perl --
use strict;
use utf8;
use warnings;
use CGI;
use DBI;

my $q = new CGI;
my $param1 = $q->param('name');
my $param2 = $q->param('password');

print "Content-type:text/html\n\n";
print "<html>\n";
print "<head></head>\n";
print "<form action=\"/cgi-bin/test2.cgi\">";
print "<label for=\"name\">お名前:</label>";
print "$param1<br>";
print "<label for=\"password\">パスワード:</label>";
print "$param2<br>";
print "<input type=\"submit\" value=\"送信\">";
print "</form>";
print "</html>";

my $user = 'root';
my $passwd = '';
my $db = DBI->connect('DBI:mysql:test:localhost', $user, $passwd);
my $sth = $db->prepare("INSERT INTO name(name, password) VALUES (?, ?)");
# $db->do("set names utf8");
$sth->execute($param1, $param2);

$sth->finish;
$db->disconnect;

print("finish\n");

mysql> select * from name;
Empty set (0.00 sec)

mysql> select * from name;
+——+———-+
| name | password |
+——+———-+
| hoge | hogehoge |
+——+———-+
1 row in set (0.00 sec)

perlでhiddenで送付する

/var/www/html/test.html

<!DOCTYPE html>
<meta charset="utf-8">
<style>
#errorMessage {
	color: red;
}
</style>
<form action="/cgi-bin/test.cgi">
<div id="errorMessage"></div>

<label for="name">お名前:</label>
<input name="name" id="name" required><br>
<label for="password">パスワード:</label>
<input type="password" name="password" id="password" required><br>
<label for="passwordConfirm">パスワード(確認):</label>
<input type="password" name="confirm" id="confirm" oninput="CheckPassword(this)"><br>
<input type="submit" value="送信">
</form>
<script>
		function CheckPassword(confirm){
			var input1 = password.value;
			var input2 = confirm.value;

			if (input1 != input2){
				confirm.setCustomValidity("入力値が一致しません");
			} else{
				confirm.setCustomValidity('');
			}
		}
</script>

/var/www/cgi-bin/test.cgi

#!/usr/bin/perl --
use strict;
use utf8;
use warnings;
use CGI;

my $q = new CGI;
my $param1 = $q->param('name');
my $param2 = $q->param('password');

print "Content-type:text/html\n\n";
print "<html>\n";
print "<head></head>\n";
print "<form action=\"/cgi-bin/test2.cgi\">";
print "<input type=\"hidden\" value=\"$param1\" name=\"name\"></input>";
print "<input type=\"hidden\" value=\"$param2\" name=\"password\"></input>";
print "<label for=\"name\">お名前:</label>";
print "$param1<br>";
print "<label for=\"password\">パスワード:</label>";
print "$param2<br>";
print "<input type=\"submit\" value=\"送信\">";
print "</form>";
print "</html>";

/var/www/cgi-bin/test2.cgi

#!/usr/bin/perl --
use strict;
use utf8;
use warnings;
use CGI;

my $q = new CGI;
my $param1 = $q->param('name');
my $param2 = $q->param('password');

print "Content-type:text/html\n\n";
print "<html>\n";
print "<head></head>\n";
print "<form action=\"/cgi-bin/test2.cgi\">";
print "<label for=\"name\">お名前:</label>";
print "$param1<br>";
print "<label for=\"password\">パスワード:</label>";
print "$param2<br>";
print "<input type=\"submit\" value=\"送信\">";
print "</form>";
print "</html>";

hiddenで送ります。

Perlのinput formの画面遷移

入力画面
/var/www/html/test.html

<!DOCTYPE html>
<meta charset="utf-8">
<style>
#errorMessage {
	color: red;
}
</style>
<form action="/cgi-bin/test.cgi">
<div id="errorMessage"></div>

<label for="name">お名前:</label>
<input name="name" id="name" required><br>
<label for="password">パスワード:</label>
<input type="password" name="password" id="password" required><br>
<label for="passwordConfirm">パスワード(確認):</label>
<input type="password" name="confirm" id="confirm" oninput="CheckPassword(this)"><br>
<input type="submit" value="送信">
</form>
<script>
		function CheckPassword(confirm){
			var input1 = password.value;
			var input2 = confirm.value;

			if (input1 != input2){
				confirm.setCustomValidity("入力値が一致しません");
			} else{
				confirm.setCustomValidity('');
			}
		}
</script>

受け手のページ(確認画面)
/var/www/cgi-bin/test.cgi

#!/usr/bin/perl --
use strict;
use utf8;
use warnings;
use CGI;

my $q = new CGI;
my $param1 = $q->param('name');
my $param2 = $q->param('password');

print "Content-type:text/html\n\n";
print "<html>\n";
print "<head></head>\n";
print "<input type=\"hidden\" value=\"$param1\" name=\"name\"></input>";
print "<input type=\"hidden\" value=\"$param2\" name=\"password\"></input>";
print "<form action=\"/cgi-bin/test2.cgi\">";
print "<label for=\"name\">お名前:</label>";
print "$param1<br>";
print "<label for=\"password\">パスワード:</label>";
print "$param2<br>";
print "<input type=\"submit\" value=\"送信\">";
print "</form>";
print "</html>";

一応、受け渡しはされてますが、、、

なんかイマイチ。。

yum -y install perl-CGI

sudo yum -y install perl-CGIで、perl-CGIをinstall

[vagrant@localhost ~]$ sudo yum -y install perl-CGI
– 中略 -
トランザクションを実行しています
インストールしています : perl-CGI-3.51-144.el6.x86_64 1/1
Verifying : perl-CGI-3.51-144.el6.x86_64 1/1

インストール:
perl-CGI.x86_64 0:3.51-144.el6

インストール後、やり直します。

データがcgiに届きました。

#!/usr/bin/perl --
use strict;
use utf8;
use warnings;
use CGI;

my $q = new CGI;
my $param1 = $q->param('name');
my $param2 = $q->param('password');

print "Content-type:text/html\n\n";
print "<html>\n";
print "<head></head>\n";
print "<h1>Hello World, $param1 password is $param2</h1>";
print "</html>";

うーん、パラメータが付くのが気になるな。。hiddenだと、type=”password”にできないし、困ったな。。

use CGIでinternal server error

form

<!DOCTYPE html>
<meta charset="utf-8">
<style>
#errorMessage {
	color: red;
}
</style>
<form action="/cgi-bin/test.cgi">
<div id="errorMessage"></div>

<label for="name">お名前:</label>
<input name="name" id="name" required><br>
<label for="password">パスワード:</label>
<input type="password" name="password" id="password" required><br>
<label for="passwordConfirm">パスワード(確認):</label>
<input type="password" name="confirm" id="confirm" oninput="CheckPassword(this)"><br>
<input type="submit" value="送信">
</form>
<script>
		function CheckPassword(confirm){
			var input1 = password.value;
			var input2 = confirm.value;

			if (input1 != input2){
				confirm.setCustomValidity("入力値が一致しません");
			} else{
				confirm.setCustomValidity('');
			}
		}
</script>

データ受け取りのcgi

#!/usr/bin/perl --
use strict;
use utf8;
use warnings;
use CGI;

my $q = new CGI;
my $param1 = $q->param('name');
my $param2 = $q->param('password');

print "Content-type:text/html\n\n";
print "<html>\n";
print "<head></head>\n";
print "<h1>Hello World</h1>";
print "</html>";

view

なんでやねん、て、use CGIをコメントアウトするとinternal server errorが消えているので、おそらくcuse CGIがinstallされていないだけかと。。

[vagrant@localhost ~]$ find `perl -e ‘print “@INC”‘` -name ‘*.pm’ -print | grep CGI

headerとsidemenuは1ファイルにインクルード化

フロントは予め作っておきます。

#!/usr/bin/perl --

print "Content-type:text/html\n\n";
$title = "トップ";
open(FH, "../html/header.html");
while($header = <FH>){
	if($header =~ /title/){
			print "<title>$title</title>";
		} else {
			print $header;
		}
}
close(FH);

open(FH, "../html/side.html");
while($side = <FH>){
		print $side;
}
close(FH);

ほほーう、なるほどね。こうすれば、わざわざ1行ずつprint “html tag”; なんて面倒なことしなくていいですね。
Perlの苦手意識が先行していたが、少し楽しくなってきた^^

mainも追加します。

#!/usr/bin/perl --

print "Content-type:text/html\n\n";
$title = "トップ";
open(FH, "../html/header.html");
while($header = <FH>){
	if($header =~ /title/){
			print "<title>$title</title>";
		} else {
			print $header;
		}
}
close(FH);

open(FH, "../html/side.html");
while($side = <FH>){
		print $side;
}
close(FH);

open(FH, "../html/hoge.html");
while($main = <FH>){
		print $main;
}
close(FH);

ひょえーーー

Perlでtitleを変数にして差し込みたいんだが。。。

#!/usr/bin/perl --

print "Content-type:text/html\n\n";
$title = "ほげ";
open(FH, "../html/header.html");
while($data = <FH>){
	
	print "$data";
}
close(FH);

titleを予め$titleとすると、、、

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>$title</title>
	<link rel="stylesheet" type="text/css" href="asset/css/main.css" />
</head>
<header>
	<p><a href="index.html">Hpscript</a></p>
	<ul>
	    <li>ユーザーID:hogehoge</li>
	    <li>2019-03-01 18:26:35</li>
	</ul>
	<nav>
		<p>システム</p>
	</nav>
</header>

これだと、タイトルが$titleで出力されるんだなー

print "Content-type:text/html\n\n";
$title = "ほげ";
open(FH, "../html/header.html");
while($data = <FH>){
	if($data =~ /title/){
			print "<title>$title</title>";
		} else {
			print $data;
		}
}
close(FH);

完全に違う気がするけどー、一応タイトルは変数にしてタイトル以外はインクルードもできるっちゃできるなーーーーーーー^^

perl cgiでhtmlファイルを読み込む

まずcgi

#!/usr/bin/perl --

print "Content-type:text/html\n\n";
print <<END;
    <html>
    <head>
    <title>HTMLファイル読み込み</title>
    </head>
    <body>
END

open(FH, "../html/hoge.html");
while($data = <FH>){
	print "$data";
}
close(FH);

print <<END;
    <br>
    </body>
    </html>
END

hoge.html

<h1>hello</h1>
perl included<br>hoge

view

これ実装するのに1時間半かかったー
open(FH, “../html/hoge.html”); のところで、../hoge.html とかやってたわ。。
むむむ、これもしかして、Content-type:text/htmlだけ指定すれば、以下は全部読み込める??

cgiから、cssやjsなどassetを読み込むから、「..」で一度上に上がって、指定すればできますね。

<link rel="stylesheet" type="text/css" href="../asset/css/main.css" />

あ、なるほど、ここで、ヘッダー、メニューをインクルードすればいいのか。頭良すぎww