perl

perlのヒアドキュメント内で変数展開できることを今頃知った。

my $abc = "Hello"; print <<"HTML_END"; $abc HTML_END 実行してみる。 Helloちなみにrubyでは以下のようにすると ヒアドキュメント内で変数を展開できる。 abc = "Hello" print <<"HTML_END" #{abc} HTML_END 今頃、知ってしまった。

文字列を生成したい。

規則性のない文字列をperlで生成したかったんです。 コード #!/usr/bin/perl use strict; use warnings; &main(); exit; sub main { my @strings = ("A".."Z","a".."z","0".."9",".","_","+","-"); my $str; my $num=100; for(my $i=0;$i<$num;$i++){ $str .…

MD5でハッシュ値を計算する方法

#!/usr/bin/perl use strict; use warnings; &main(); exit; sub main { my $passwd = "hoge"; my @salts = ("A".."Z","a".."z","0".."9",".","/"); my $salt; for(my $i=0;$i<8;$i++){ srand(); $salt .= $salts[int(rand(64))]; } my $epasswd = crypt($pa…

mac環境でperlからpostgresqlにアクセスする

postgresqlのversion % psql --version psql (PostgreSQL) 8.4.2 contains support for command-line editing perlプログラム 以下のperlプログラムからpostgresqlにアクセスしようとしたけど、 エラーが出てアクセスできなかった。 #!/opt/local/bin/perl u…

perlでcgiスクリプトを作っている

Sites/index.cgi 1 #!/usr/bin/perl 2 3 use strict; 4 use warnings; 5 6 &main(); 7 exit; 8 9 sub main { 10 if ($ENV{'HTTP_COOKIE'}) { 11 if (&check_ck()) { &private_pg(); } 12 else { &basic_pg(-2); } 13 } 14 else { 15 if ($ENV{'REQUEST_METHO…

Perlでスクリプト書くとき

http://d.hatena.ne.jp/tokuhirom/20091207/1260156962 #!/usr/bin/perl use strict; use warnings; use Getopt::Long; use Pod::Usage; my $port = 8080; my $global_var = 1; # ここにグローバル変数を列挙する GetOptions( 'p|port=i' => \$port ) or pod…

COOKIEクッキーの削除でハマってた。

以下のように、クッキーを発行しました。 このCGI、test.cgi Set-Cookie: CookieTest=xyz;expires=Tue, 10-May-2030 00:00:00 GMT; Content-type: text/htmlそれと、このクッキーを削除するCGI、del.cgiを privateディレクトリの下に配置しました。 Set-Cook…

timestamp型の値をperlから計算してハマった。

postgresqlのデータベーステーブルに入っているtimestamp型の値を1日進めた値が欲しかった。やり方は、 ■ - fyamaの日記に書いている通りやって、できた。 my $v_time = "'2009-03-24 16:00:00'"; my $v_interval = "'+1 day'"; my $query = "SELECT CAST(? …

utf-8フラグとかよく分からなかった

ググってたら、解決した。 あとで詳しく書きたい。 http://www.crawler.jp/archives/000272.html http://www.rwds.net/kuroita/program/Perl_unicode.html#use_utf8 Perl の多言語処理 - Perl ヒント集 (ja) 文字列を print すると「Wide character in print…

Use of uninitialized value in concatenation (.) or string atというエラー

1 #!/usr/bin/perl 2 3 use warnings; 4 use strict; 5 6 my $hello; 7 print "$hello\n"; このプログラムを実行すると、以下のようなエラーメッセージが出力されます。 Use of uninitialized value in concatenation (.) or string at ./hello.pl line 7. …

perlのif文を勘違いしてた

if (...) print "Hello\n"; elsif (...) print "World\n"; このような記述が、"できる"と思っていたが、"できない"。 以下のように書かなくてはいけない。 if (...) { print "Hello\n"; } elsif (...) { print "World\n"; } "{"と"}"が必要。または、 print …

基本的なカウンタでハマった

1 #! /usr/bin/perl 2 3 open(IN, "< ./count.dat"); 4 $count = <IN>; 5 close IN; 6 7 ++$count; 8 9 open(OUT, "> ./count.dat"); 10 print OUT $count; 11 close OUT; 12 13 print STDOUT <<END; 14 Content-type: text/html 15 16 <html> 17 <head> 18 </head> 19 <body> 20 $count 21 </body> 22 </html> 23 END 何度、更…

正規表現

その前にマッチ演算子 while (<STDIN>) { if (/Hello/) { print; } } ここで、 /Hello/ のところをマッチ演算子と言う。 defalutでは変数$_に適用され、この場合では変数$_にHelloが含まれていれば、真を返し、そのときの変数$_を出力します。 /Hello$/ 『$』はこの</stdin>…

$_と$.

$_って何なのか? その前に、 while (<STDIN>) { print; } と while ($_ = <STDIN>) { print $_; } は同じ。 ということ。 $.って何なのか? ズバリ、行番号です。 while (<STDIN>) { print "$. $_"; } なんて感じにすると、現在の行番号を付加してくれます。</stdin></stdin></stdin>

標準入力から1行読み込んでくれる

が呼ばれると、標準入力から1行読み込んでくれます。1行とは改行コードまでのことで、改行コードも含みます。 ちなみに、STDIN は standard inputの略です。 どんな、感じ? 1 #!/usr/bin/perl 2 3 use strict; 4 use warnings; 5 6 my $a = <STDIN>; 7 my $b = <STDIN>;</stdin></stdin>…

printのバッファ機能

perlのprint関数は標準でバッファをするみたいです。 なぜ? システムコールを少なくするため。 printが呼び出されるたびにシステムコールをするのと、 バッファにある程度、溜まったらシステムコールするのとでは 後者のほうがシステムコールを少なくできる…

@配列名

perlでも配列変数を作成することができます。 $変数名[インデックス] 配列変数への値の代入は以下のように $arg[0]=0; $arg[1]=1; $arg[2]=2; します。でも、配列の数が10個とかに増えたときにこのような代入をするのは面倒です。 そこで @配列名 という記…

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

リストコンテキスト 配列全体を表す。 ($a,$b,$c) = @arg; @arg = (0,1,2); @arg2 = @arg1; スカラーコンテキスト 数値として振る舞う $value = @arg; @arg > 0; @arg + 1

配列は伸びたり、縮んだりする

@arg = (0,1,2); @arg = (0,1); #arg[2]は削除される $arg[5] = 5; @arg = (0,1); #$arg[0]と$arg[1]しか存在しなくなる。他は削除される。 @arg = (0,1); $arg[5] = 5; # @argの中身は # (0,1,undef,undef,undef,5)

変数の交換

変数aと変数bの値を交換したいとき、 ($a,$b) = ($b,$a); ということができます。 cのように中間変数を挟む必要はなくなります。

配列へのアクセス

@配列名 のような配列を作ると、次のような決まりになります。 $#配列名 には 最後の要素のインデックスが代入される。 @配列名を数値として扱うと配列の個数になる。#!/usr/bin/perl @arg = ("one","two","three","four","five"); print "$arg[$#arg]\n"; p…

スライス

スライスとは? 配列の一部を使ったリストのことを言います。 具体例 配列argの最初と2番目を交換 @arg[1,0] = @arg[0,1]; 配列argの偶数番目だけを取り出し、新配列に代入 @arg2 = @arg[0,2,4,6,8,10,12]; リストからもスライスができます。 @arg = (10,20,…

foreach ふぉーいーち

whileやforみたいな、繰り返しを行う制御文。 #!/usr/bin/perl @arg = 1..10; $sum = 0; $tmp = 0; foreach $tmp (@arg) { $sum += $tmp } print "$sum\n"; 結果 55 foreachの処理は 配列argの$arg[0]の値を$tmpにセットして、$sumに加えます。 以下等同様に…

命令die

die 引数 この命令は引数のメッセージを出力して、プログラムを終了します。

@ARGV

コマンドラインからプログラムに渡す引数は配列ARGVに代入されます。 ARGV とは argument(引数)のvalue(値)の略です。 $ ./test.pl 1 2 3 4 5 と引数を与えて、プログラムを実行すると、 $ARGV[0] = 1; $ARGV[1] = 2; $ARGV[2] = 3; $ARGV[3] = 4; $ARGV[4] …

eval命令

evalとは、evaluate(評価する)という英語の略。 eval(引数); の形式で使い、受け取った引数をPerlプログラムとして評価します。 1 #!/usr/bin/perl 2 3 print eval($ARGV[0])."\n"; 実行してみる $ chmod +x test.pl $ ./test.pl 1+2 3

文字列として比較する

perlは変数が数値として振る舞うこともできますし、文字列として振る舞うこともできます。 次のように変数を初期化し、数値として比較すると両方の変数は等しいです。 $a = "1"; $b = "01"; if ($a == $b) { //等しい ... } しかし、数値としてではなく、文…

真と偽

perlでは変数が数値としても、文字列としても振る舞うことは文字列として比較する - rderaログで述べたが、それに関連してperlでは何を真と決め、何を偽と決めているかについて学びます。perlでは数値の場合、0以外を真、0を偽としています。 つまり、 if (1…

ループを脱出する命令last

無限ループを意図的に作っておき、ifとlastを使いループを脱出するという手法が使われています。 while (1) { #無限ループ if (条件) { ... last; } } 条件に当てはまり、if文に入ると命令を実行し、最後のlastでwhileループの外に抜け出すことができます。 …

perlで==とeqの違い

1 #!/usr/bin/perl 2 3 use strict; 4 use warnings; 5 6 my($flag) = @ARGV; 7 if ($flag == 1) { print "$flag\n";} 8 if ($flag eq '1') { print "$flag\n";} == と eq の違いをよく分かってなくて大変だった。