プログラミング言語/Perl
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
//方法は何通りもある(TIMTOWTDI - There is more than one w...
#contents
~
-とりあえず作ってみた今は反省している
-せっかくだからHelloWorldだけ出す
-Wikiの記法をよく知らない。気付いたら誰か見栄えを直してくれ
*言語の特徴 [#q2d7f017]
-インタプリタ型言語です。
-世の中のCGIを記述する上で現在最も幅広く使われていること...
-いろいろやる上で基本的にお金はかかりません。
-既に他の言語を使用したことがある人向け
--心底「型」に関しておおらかな言語
--変数は$変数名,配列は@配列名,配列要素は$配列名[添字],連...
--C言語のポインタに相当するものもあるが通常はリファレンス...
--配列の添字は0から (特殊変数 $[ で変更可能)
--サンプルがいろいろ出ているが、Perlの真髄は文字列操作
*開発環境 [#k1b8fd0d]
**Windows [#a5d67a0b]
***Perlのインスコ [#q6f37401]
[[ActiveState:http://aspn.activestate.com/ASPN/]]から[[Ac...
perl -v
としてThis is perl,...と表示されればOKです。
***ソースの編集方法 [#wa7eff01]
メモ帳でもいいです。テキストが編集できるものなら何でもい...
""Engineering support for Visual Perl was discontinued as...
とある。
""訳:Visual Perlの設計サポートは2005年12月15日をもって打...
//間違ってたらゴメン。直してくれ
他にも[[窓の杜:http://www.forest.impress.co.jp/]]や[[Vect...
***モジュールとCPAN [#wa7eff02]
[[CPAN(Comprehensive Perl Archive Network):http://www.cpa...
真面目に書くときはuse strictしておけ!
* VIP的Perl用語解説 [#a05c35f1]
:ワンライナー|プログラムをソースファイルにかかずコマンド...
:シュワルツ変換|並び替えを効率よくやるための記法。まず相...
:ラクダ本|オライリー・ジャパンから出版されているLarry Wal...
*プログラム例 [#cb6c0481]
[[初心者用課題]]に載っているものです。
**Hello World [#c40e0028]
#!perl
print "Hello World!";
(注意:#!行は環境依存)
をhello.plとして保存し、
perl hello.pl
として実行すると
Hello World!
と表示される。
***解説 [#k39593d5]
1: #!perl
perl.exeというperlインタプリタを呼び出すコマンド。お約束...
-注意
この行は、PerlがWeb上のCGIとして使われることが多く、その...
詳しくは[[shebang]]の項目を参照せよ。
2: print "Hello World!";
"Hello World!"という[[文字列]]を出力するための行。printと...
**FizzBuzz [#jf556caa]
print+(Fizz)[$_%3].(Buzz)[$_%5]||$_,$/for 1..100
・上のコードについて
--for(1..100)とforeach(1..100)は等価。
--Perlでは単項の+演算子は何もしないものとして定義されてい...
--FizzやBuzzなどのbareword(裸のワード)(クォートされてない...
--リストスライスと上記のbarewordの振る舞いにより(Fizz)[0]...
--Perlでは空文字は偽なので、(Fizz)[$_%3]と(Buzz)[$_%5]が...
--$/は入力レコードの区切り文字で通常は改行文字である。つ...
--初期化してない値を使っているので警告(-wオプションやuse ...
--また、use strictの下ではbarewordは不正となるのでエラー...
これらを踏まえてもう一度コードを見てみると、
foreach $_ (1..100) {
my $str = ("Fizz", "", "")[$_ % 3].("Buzz", "", "", "",...
$str = $_ if($str eq '');
print($str."\n")
}
とほぼ同じ意味になるのが分かるだろう。
**平方根 [#r50c480e]
#!/usr/local/bin/perl
use strict;
my $MAX = 30; # 小数点以下30位まで求める。
my $num = <>;
$num -=0;
my $flg = 0;
if($num<0){
$flg = 1;
$num *= -1;
}
my $cnt = 0;
1while($cnt++**2<$num);
if(--$cnt**2 == $num){
print $cnt;
exit;
}
print --$cnt.".";
$num = $num - $cnt**2;
$cnt *= 2;
while($MAX--){
$num *=100;
my $r = 0;
1while($num>(++$r+$cnt*10)*$r);
if($num == ($r+$cnt*10)*$r){
print $r;
last;
}
$num -= (--$r+$cnt*10)*$r;
$cnt = $cnt*10+$r*2;
print $r;
}
$flg && print "i";
print$/;
虚数、小数にも対応
誰か解説してくれ。
**素数判定 [#t1d5fa2d]
#!perl
$n=100;
for($i=2;$i<=sqrt($n);$i++){
if($n%$i==0){
print "n is not a prime number.";
exit;
}
}
print "n is a prime number.";
***解説 [#r43c3496]
2: $n=100;
「[[変数]]nに100を代入する」という意味です。右の値を左に...
3: for($i=2;$i<=sqrt($n);$i++){
プログラミング初心者の(多分)最初の壁であるループ構文で...
$i++
ってのは変数$iの値を1増やすためによく使われます。ここでは...
4: if($n%$i==0){
$n%$iは「$nを$iで割った余り」を意味しまう(数学の言葉ある...
5: print "n is not a prime number.";
割り切れたということは素数じゃないということなのでその旨...
6: exit;
プログラムそのものを終了する命令です。今回はループを抜け...
***別解例 [#wc29037a]
$n = 101;
for(2 .. int sqrt $n){
print "$n is not a prime number.\n" and exit unless(...
}
print "$n is a prime number.\n";
調べる数が$nです。2~√nまで特殊変数$_に代入していき、$nが...
***コマンドラインから引数を取るバージョン [#wc29037b]
$n = shift;
for my $i (2 .. sqrt $n){
print "$n is not a prime number.\n" and exit unless(...
}
print "$n is a prime number.\n";
実行
perl test.pl 101
1行目のshiftで引数を変数に格納します。他は前の例とだいた...
**エラトステネスのふるい [#n6fae087]
#!perl
$N=100;
@prime = ();
@zahlen = 2 .. $N # ステップ1
do{
push(@prime,$zahlen[0]); # ステップ2
for($j=$#zahlen;$j>=0;$j--){ # ステップ3(for文全体)
if($zahlen[$j]%$prime[$#prime]==0){
splice(@zahlen,$j,1);
}
}
} while ($zahlen[$#zahlen]>$prime[$#prime]**2); # ステッ...
foreach $k (@prime){ #以下表示部分
print "$k ";
}
foreach (@zahlen){
print "$_ ";
}
***解説 [#bc10bfec]
do〜whileを利用した例。[[エラトステネスの篩-wikipedia:htt...
3: @prime = ();
@primeには8行目でいきなりpush(要素の末尾に追加)するから...
****ステップ1 [#kbc0dac3]
以下説明では$N=100の場合を使っていくことにします。$zahlen...
****ステップ2 [#o611f665]
7: do{ 〜 14| } while ($zahlen[$#zahlen]>$prime[$#prime]...
ループ記法の1つ、do〜while文。while(A){B}はABAB...ABAで終...
8: push(@prime,$zahlen[0]);
pushってのは配列の末尾に配列を足すことができる命令です。...
****ステップ3 [#gd4d4b81]
ここでは配列要素を削除していきますが、前からその処理をや...
9: for($j=$#zahlen;$j>=0;$j--){
$#zahlenは@zahlenの最後の添字(要素数-1)を指しています。...
9: for $j(reverse 0 .. $#zahlen){
とも書けます。
10: if($zahlen[$j]%$prime[$#prime]==0){
ステップ2で最後に加えた数は@primeの末尾にいます。$#prime...
11: splice(@zahlen,$j,1);
spliceは配列,削除を始める添字,削除する項数を受け取って削...
****ステップ4 [#k11c25bb]
このステップはwhile文ですが、ここまで分かっていれば説明の...
15: foreach $k (@prime){
これはPerl独特の記法です。@primeの要素を$prime[0]~$prime...
for($k=0;$k<=$#prime;$k++){
後者のコーディングをしたときのブロック内で$prime[$k]にあ...
for($k=0;$k<=$#prime;$k++){
for $k (0 .. $#prime){
foreach $k (0 .. $#prime){
は同じ動きです。
18: foreach (@zahlen){
みたいに添字を省略した場合はデフォルトの特殊変数$_にその...
19: print "$_ ";
こんな感じ
***別解例 [#h3ea0370]
$n = 100;
@prime = (); # 素数リスト
@zahlen = (2 .. $n); # 探索リスト
do{
push @prime, $zahlen[0]; # ステップ2
@zahlen = grep { $_ % $zahlen[0] } @zahlen; # ステ...
} while ($zahlen[-1] > $prime[-1]**2); # ステップ4
print "@prime @zahlen\n";
**閏年判定 [#ybd72cdd]
#!perl
$YEAR = 2007;
if(($YEAR%4==0&&$YEAR%100!=0)||$YEAR%400==0){
print("$YEAR is a leap year.");
}else{
print("$YEAR is not a leap year.");
}
***解説 [#ib1573ab]
3: if(($YEAR%4==0&&$YEAR%100!=0)||$YEAR%400==0){
この行が全てです。このプログラムの価値はここだけにありま...
**転置行列 [#t0c1442b]
#!perl
@a = ( [ 1 , 2 , 3 ],
[ 4 , 5 , 6 ],
[ 7 , 8 , 9 ],
[10 ,11 , 12] );
$m = $#a;
$n = @{$a[0]}-1;
for($i=0;$i<=$m;$i++){
for($j=0;$j<=$n;$j++){
$b[$j][$i] = $a[$i][$j];
}
}
for($j=0;$j<=$n;$j++){
for($i=0;$i<=$m;$i++){
print "$b[$j][$i] ";
}
print "\n";
}
二次元配列を使用した例。
***別解例 [#t3359f70]
モジュールを使用した例。強度のMじゃなければこっちの別解(...
use Math::Matrix;
$a = new Math::Matrix(
[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[ 10, 11, 12] );
$b = $a->transpose;
$b->print;
最後の2行は
print $a->transpose;
ってやってもOKで、$bにオブジェクトをコピーしない分だけ早...
**線形合同法 [#m2e0c082]
//題意を勘違いしていたので0〜1の範囲に修正($Mで割っただけ)
#!perl
# X[n+1] = (A*X[n]+B) mod M
$A = 997;
$B = 1;
$M = 2 ** 16;
$n = 100;
$x[0] = 12345; # 配列@xの要素は整数 1つ1つの乱数は$x[$i]...
$s=0;
for($i=0;$i<$n-1;$i++){
$x[$i+1] = (($A*$x[$i]+$B) % $M);
}
for($i=0;$i<$n;$i++){
$s += $x[$i]/$M;
}
for($i=0;$i<$n;$i++){
printf ("%0.4f ",$x[$i]/$M);
print "\n" if($i%10==9);
}
print "Average : " . $s/$n;
***解説 [#b3dbe5ff]
5: $M = 2 ** 16;
ここでは**演算子を使いました。2 ** 16は「2の16乗(2×2×…×2...
9: for($i=0;$i<$n-1;$i++){
は
9: for $i(0 .. $n-2){
とも書ける。C言語とかでガリガリ書いてた人以外は、こっちの...
13: $s += $x[$i];
これはメジャーなプログラミング言語ではよく見られる略記法...
$s = $s + $x[$i];
と書いても同じことです #でもこれ、左右が絶対等しくないか...
16: printf ("%5.d ",$x[$i*10+$j]);
ここは表示するだけだから大したところではないけど、一応解...
17: print "\n" if($i%10==9);
見栄えのために10個ごとに改行を入れています。添字は0から始...
if($i%10==9){
print "\n";
}
と書くのと同じです。
**ニュートン法で平方根を求める [#u623ba20]
#!perl
$n = 3; # $nの平方根を求める
$m = 20; # ループ回数
$x0 = 1; # 初期値
@r = ();
$r[0] = $x0;
for($i = 0; $i < $m ; $i ++ ){
$r[$i+1] = root($r[$i]);
}
print "$r[$m-1]";
sub root{
my($rn,$rnn);
$rn = $_[0];
$rnn = ($rn**2+$n)/(2*$rn);
return $rnn;
}
exit;
***解説 [#pf1452ae]
7: @r = ();
これは@rという空の配列を用意するお。8行目で初期値をセット...
10-12: for($i=0;$i<$m;$i++){ $r[$i+1]=root($r[$i]); }
ニュートン法を使って計算する部分は後述のrootっていうサブ...
13: print "$r[$m-1]";
これが計算したなかで一番近い値となる。$n=3,$m=20の場合小...
15: sub root{
[[C]]言語などの「関数」にあたるのがPerlの「サブルーチン...
16: my($rn,$rnn);
変数のネーミングがちょっと気に入らないけど、ここでは$rnは...
17: $rn = $_[0];
$_[0]にはn番目の値が引数として渡されているので、それをと...
18: $rnn = ($rn**2+$n)/(2*$rn);
ここがニュートン法の計算式で、なんでこうなるかは数学の範...
*数当てゲーム [#ffb233da]
#!/usr/local/bin/perl -W
use strict;
local $/;
print eval <DATA>;
__DATA__
$, = $\ = $/ = "\n";
my $flg = 1;
while($flg){
my $number = 1000 + int rand 9000;
while(<>){
$number==int&&last;
print$_>$number?'bigger...':'smaller...';
}
print 'hit!!','again? y/n';
while(<>){
/^y$/i&&last;
/^n$/i&&$flg--&&last;
}
}
'good bye';
何この邪悪なコード。ふざけてるの?
B:
$Ans = int rand 9000;
A:
print"入力=>";$_=<>;
printf"入力は答えより%sです\n",$_>$Ans?"大きい":"小さい";
&more if/$Ans/;goto A;
sub more{
print"正解です=>$Ans\n\nもう一回やる?y/n=>";
$_=<>;goto B if/y/;exit if/n/;
}
*配列いじり [#yefe9978]
print shift @ARGV;
print " ";
print "0 " while shift @ARGV;
実行例
perl test1.pl 3 5 2 4 2
結果例
3 0 0 0 0
↑"配列"いじりじゃないうえに、引数に0が含まれるとそこでル...
#!/usr/local/bin/perl
use strict;
$, = ", ";
$\ = $/;
my @aa = (3,6,2,4,2);
print @aa;
splice @aa,1,$#aa,(0)x$#aa;
print @aa;
*Base64 [#l20f091e]
use MIME::Base64;
$encoded = encode_base64('vipper');
$decoded = decode_base64($encoded);
[[CPANモジュールそのまんま:http://search.cpan.org/~gaas/M...
*Caesar暗号解読 [#o607f99e]
use strict;
my $words = "qdq-gi.q-a ziatmxxitmdqibtqi-ustbi ri.qmoqr...
my @answers=();
for (1 .. 30){ #全部で30文字なので30回ループする
$words =~ tr/abcdefghijklmnopqrstuvwxyz .,-/-abcdefghi...
push (@answers, $words) if $words =~ m/person/; #perso...
}
while (@answers){
print shift @answers;
print "\n";
}
#答えが1通りであることがわかってる場合は、8行目のpushの...
別解
#!/usr/local/bin/perl
use strict;
$\ = $/;
$_ = "qdq-gi.q-a ziatmxxitmdqibtqi-ustbi ri.qmoqrcxi.qbu...
y/abcdefghijklmnopqrstuvwxyz .,\-/bcdefghijklmnopqrstuvw...
print;
解が複数あると仮定するなら、
#!/usr/local/bin/perl
use strict;
$\ = $/;
my $c = "qdq-gi.q-a ziatmxxitmdqibtqi-ustbi ri.qmoqrcxi....
($_ = $c) && y/abcdefghijklmnopqrstuvwxyz .,\-/bcdefghij...
*フィボナッチ数列 [#e5eb0915]
[[Math:Big:http://search.cpan.org/~tels/Math-Big-1.12/lib...
*真と偽 [#p7bf8db5]
[[とほほのperl入門(概要編) - ◆ 真(true)と偽(false) :htt...
*スタック [#d2cf07b1]
#!/usr/local/bin/perl -W
use strict;
my %calc = (
'+' => sub{pop(@{$_[0]})+pop@{$_[0]};},
'-' => sub{splice(@{$_[0]},$#{$_[0]}-1,1)-pop@{$_[0]};},
'*' => sub{pop(@{$_[0]})*pop@{$_[0]};},
'/' => sub{splice(@{$_[0]},$#{$_[0]}-1,1)/pop@{$_[0]};},
);
my @stack = ();
defined$calc{$_}?push@stack,&{$calc{$_}}(\@stack):sub{
my @x = @_;
$x[0] =~ y/[0-9\-]//c;
push@{$x[1]}, int$x[0] if $x[0] eq int$x[0];
}->($_,\@stack)for@ARGV;
print$stack[0];
*参考リンク [#of2e4318]
:[[Perl-users.jp - 日本のPerlユーザのためのハブサイト:htt...
モダンなPerl : 日本のPerlユーザのためのハブサイト
:[[perl-mongers.org:http://perl-mongers.org/]]|
モダンなPerl : OpenIDでログイン出来るPerlユーザblog。Perl...
:[[Perl「言語」初心者がモダンなPerlを高速に学ぶ方法 - dan...
plaggerのソースを読もう
:[[プログラミング言語Perl 詳細リファレンス - Perl入門~サ...
詳細なリファレンス、サンプルコード付き
::[[Perlという言語について - Perl入門~サンプルコードによ...
''Perlのバージョン5以降であればPerlできれいにプログラムを...
//このページの冒頭にでも書いた方が良いのかな、とも思った...
::[[Perlプログラマーの皆さん - Perl入門~サンプルコードに...
Perlをやっている人のブログへのリンク
終了行:
//方法は何通りもある(TIMTOWTDI - There is more than one w...
#contents
~
-とりあえず作ってみた今は反省している
-せっかくだからHelloWorldだけ出す
-Wikiの記法をよく知らない。気付いたら誰か見栄えを直してくれ
*言語の特徴 [#q2d7f017]
-インタプリタ型言語です。
-世の中のCGIを記述する上で現在最も幅広く使われていること...
-いろいろやる上で基本的にお金はかかりません。
-既に他の言語を使用したことがある人向け
--心底「型」に関しておおらかな言語
--変数は$変数名,配列は@配列名,配列要素は$配列名[添字],連...
--C言語のポインタに相当するものもあるが通常はリファレンス...
--配列の添字は0から (特殊変数 $[ で変更可能)
--サンプルがいろいろ出ているが、Perlの真髄は文字列操作
*開発環境 [#k1b8fd0d]
**Windows [#a5d67a0b]
***Perlのインスコ [#q6f37401]
[[ActiveState:http://aspn.activestate.com/ASPN/]]から[[Ac...
perl -v
としてThis is perl,...と表示されればOKです。
***ソースの編集方法 [#wa7eff01]
メモ帳でもいいです。テキストが編集できるものなら何でもい...
""Engineering support for Visual Perl was discontinued as...
とある。
""訳:Visual Perlの設計サポートは2005年12月15日をもって打...
//間違ってたらゴメン。直してくれ
他にも[[窓の杜:http://www.forest.impress.co.jp/]]や[[Vect...
***モジュールとCPAN [#wa7eff02]
[[CPAN(Comprehensive Perl Archive Network):http://www.cpa...
真面目に書くときはuse strictしておけ!
* VIP的Perl用語解説 [#a05c35f1]
:ワンライナー|プログラムをソースファイルにかかずコマンド...
:シュワルツ変換|並び替えを効率よくやるための記法。まず相...
:ラクダ本|オライリー・ジャパンから出版されているLarry Wal...
*プログラム例 [#cb6c0481]
[[初心者用課題]]に載っているものです。
**Hello World [#c40e0028]
#!perl
print "Hello World!";
(注意:#!行は環境依存)
をhello.plとして保存し、
perl hello.pl
として実行すると
Hello World!
と表示される。
***解説 [#k39593d5]
1: #!perl
perl.exeというperlインタプリタを呼び出すコマンド。お約束...
-注意
この行は、PerlがWeb上のCGIとして使われることが多く、その...
詳しくは[[shebang]]の項目を参照せよ。
2: print "Hello World!";
"Hello World!"という[[文字列]]を出力するための行。printと...
**FizzBuzz [#jf556caa]
print+(Fizz)[$_%3].(Buzz)[$_%5]||$_,$/for 1..100
・上のコードについて
--for(1..100)とforeach(1..100)は等価。
--Perlでは単項の+演算子は何もしないものとして定義されてい...
--FizzやBuzzなどのbareword(裸のワード)(クォートされてない...
--リストスライスと上記のbarewordの振る舞いにより(Fizz)[0]...
--Perlでは空文字は偽なので、(Fizz)[$_%3]と(Buzz)[$_%5]が...
--$/は入力レコードの区切り文字で通常は改行文字である。つ...
--初期化してない値を使っているので警告(-wオプションやuse ...
--また、use strictの下ではbarewordは不正となるのでエラー...
これらを踏まえてもう一度コードを見てみると、
foreach $_ (1..100) {
my $str = ("Fizz", "", "")[$_ % 3].("Buzz", "", "", "",...
$str = $_ if($str eq '');
print($str."\n")
}
とほぼ同じ意味になるのが分かるだろう。
**平方根 [#r50c480e]
#!/usr/local/bin/perl
use strict;
my $MAX = 30; # 小数点以下30位まで求める。
my $num = <>;
$num -=0;
my $flg = 0;
if($num<0){
$flg = 1;
$num *= -1;
}
my $cnt = 0;
1while($cnt++**2<$num);
if(--$cnt**2 == $num){
print $cnt;
exit;
}
print --$cnt.".";
$num = $num - $cnt**2;
$cnt *= 2;
while($MAX--){
$num *=100;
my $r = 0;
1while($num>(++$r+$cnt*10)*$r);
if($num == ($r+$cnt*10)*$r){
print $r;
last;
}
$num -= (--$r+$cnt*10)*$r;
$cnt = $cnt*10+$r*2;
print $r;
}
$flg && print "i";
print$/;
虚数、小数にも対応
誰か解説してくれ。
**素数判定 [#t1d5fa2d]
#!perl
$n=100;
for($i=2;$i<=sqrt($n);$i++){
if($n%$i==0){
print "n is not a prime number.";
exit;
}
}
print "n is a prime number.";
***解説 [#r43c3496]
2: $n=100;
「[[変数]]nに100を代入する」という意味です。右の値を左に...
3: for($i=2;$i<=sqrt($n);$i++){
プログラミング初心者の(多分)最初の壁であるループ構文で...
$i++
ってのは変数$iの値を1増やすためによく使われます。ここでは...
4: if($n%$i==0){
$n%$iは「$nを$iで割った余り」を意味しまう(数学の言葉ある...
5: print "n is not a prime number.";
割り切れたということは素数じゃないということなのでその旨...
6: exit;
プログラムそのものを終了する命令です。今回はループを抜け...
***別解例 [#wc29037a]
$n = 101;
for(2 .. int sqrt $n){
print "$n is not a prime number.\n" and exit unless(...
}
print "$n is a prime number.\n";
調べる数が$nです。2~√nまで特殊変数$_に代入していき、$nが...
***コマンドラインから引数を取るバージョン [#wc29037b]
$n = shift;
for my $i (2 .. sqrt $n){
print "$n is not a prime number.\n" and exit unless(...
}
print "$n is a prime number.\n";
実行
perl test.pl 101
1行目のshiftで引数を変数に格納します。他は前の例とだいた...
**エラトステネスのふるい [#n6fae087]
#!perl
$N=100;
@prime = ();
@zahlen = 2 .. $N # ステップ1
do{
push(@prime,$zahlen[0]); # ステップ2
for($j=$#zahlen;$j>=0;$j--){ # ステップ3(for文全体)
if($zahlen[$j]%$prime[$#prime]==0){
splice(@zahlen,$j,1);
}
}
} while ($zahlen[$#zahlen]>$prime[$#prime]**2); # ステッ...
foreach $k (@prime){ #以下表示部分
print "$k ";
}
foreach (@zahlen){
print "$_ ";
}
***解説 [#bc10bfec]
do〜whileを利用した例。[[エラトステネスの篩-wikipedia:htt...
3: @prime = ();
@primeには8行目でいきなりpush(要素の末尾に追加)するから...
****ステップ1 [#kbc0dac3]
以下説明では$N=100の場合を使っていくことにします。$zahlen...
****ステップ2 [#o611f665]
7: do{ 〜 14| } while ($zahlen[$#zahlen]>$prime[$#prime]...
ループ記法の1つ、do〜while文。while(A){B}はABAB...ABAで終...
8: push(@prime,$zahlen[0]);
pushってのは配列の末尾に配列を足すことができる命令です。...
****ステップ3 [#gd4d4b81]
ここでは配列要素を削除していきますが、前からその処理をや...
9: for($j=$#zahlen;$j>=0;$j--){
$#zahlenは@zahlenの最後の添字(要素数-1)を指しています。...
9: for $j(reverse 0 .. $#zahlen){
とも書けます。
10: if($zahlen[$j]%$prime[$#prime]==0){
ステップ2で最後に加えた数は@primeの末尾にいます。$#prime...
11: splice(@zahlen,$j,1);
spliceは配列,削除を始める添字,削除する項数を受け取って削...
****ステップ4 [#k11c25bb]
このステップはwhile文ですが、ここまで分かっていれば説明の...
15: foreach $k (@prime){
これはPerl独特の記法です。@primeの要素を$prime[0]~$prime...
for($k=0;$k<=$#prime;$k++){
後者のコーディングをしたときのブロック内で$prime[$k]にあ...
for($k=0;$k<=$#prime;$k++){
for $k (0 .. $#prime){
foreach $k (0 .. $#prime){
は同じ動きです。
18: foreach (@zahlen){
みたいに添字を省略した場合はデフォルトの特殊変数$_にその...
19: print "$_ ";
こんな感じ
***別解例 [#h3ea0370]
$n = 100;
@prime = (); # 素数リスト
@zahlen = (2 .. $n); # 探索リスト
do{
push @prime, $zahlen[0]; # ステップ2
@zahlen = grep { $_ % $zahlen[0] } @zahlen; # ステ...
} while ($zahlen[-1] > $prime[-1]**2); # ステップ4
print "@prime @zahlen\n";
**閏年判定 [#ybd72cdd]
#!perl
$YEAR = 2007;
if(($YEAR%4==0&&$YEAR%100!=0)||$YEAR%400==0){
print("$YEAR is a leap year.");
}else{
print("$YEAR is not a leap year.");
}
***解説 [#ib1573ab]
3: if(($YEAR%4==0&&$YEAR%100!=0)||$YEAR%400==0){
この行が全てです。このプログラムの価値はここだけにありま...
**転置行列 [#t0c1442b]
#!perl
@a = ( [ 1 , 2 , 3 ],
[ 4 , 5 , 6 ],
[ 7 , 8 , 9 ],
[10 ,11 , 12] );
$m = $#a;
$n = @{$a[0]}-1;
for($i=0;$i<=$m;$i++){
for($j=0;$j<=$n;$j++){
$b[$j][$i] = $a[$i][$j];
}
}
for($j=0;$j<=$n;$j++){
for($i=0;$i<=$m;$i++){
print "$b[$j][$i] ";
}
print "\n";
}
二次元配列を使用した例。
***別解例 [#t3359f70]
モジュールを使用した例。強度のMじゃなければこっちの別解(...
use Math::Matrix;
$a = new Math::Matrix(
[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[ 10, 11, 12] );
$b = $a->transpose;
$b->print;
最後の2行は
print $a->transpose;
ってやってもOKで、$bにオブジェクトをコピーしない分だけ早...
**線形合同法 [#m2e0c082]
//題意を勘違いしていたので0〜1の範囲に修正($Mで割っただけ)
#!perl
# X[n+1] = (A*X[n]+B) mod M
$A = 997;
$B = 1;
$M = 2 ** 16;
$n = 100;
$x[0] = 12345; # 配列@xの要素は整数 1つ1つの乱数は$x[$i]...
$s=0;
for($i=0;$i<$n-1;$i++){
$x[$i+1] = (($A*$x[$i]+$B) % $M);
}
for($i=0;$i<$n;$i++){
$s += $x[$i]/$M;
}
for($i=0;$i<$n;$i++){
printf ("%0.4f ",$x[$i]/$M);
print "\n" if($i%10==9);
}
print "Average : " . $s/$n;
***解説 [#b3dbe5ff]
5: $M = 2 ** 16;
ここでは**演算子を使いました。2 ** 16は「2の16乗(2×2×…×2...
9: for($i=0;$i<$n-1;$i++){
は
9: for $i(0 .. $n-2){
とも書ける。C言語とかでガリガリ書いてた人以外は、こっちの...
13: $s += $x[$i];
これはメジャーなプログラミング言語ではよく見られる略記法...
$s = $s + $x[$i];
と書いても同じことです #でもこれ、左右が絶対等しくないか...
16: printf ("%5.d ",$x[$i*10+$j]);
ここは表示するだけだから大したところではないけど、一応解...
17: print "\n" if($i%10==9);
見栄えのために10個ごとに改行を入れています。添字は0から始...
if($i%10==9){
print "\n";
}
と書くのと同じです。
**ニュートン法で平方根を求める [#u623ba20]
#!perl
$n = 3; # $nの平方根を求める
$m = 20; # ループ回数
$x0 = 1; # 初期値
@r = ();
$r[0] = $x0;
for($i = 0; $i < $m ; $i ++ ){
$r[$i+1] = root($r[$i]);
}
print "$r[$m-1]";
sub root{
my($rn,$rnn);
$rn = $_[0];
$rnn = ($rn**2+$n)/(2*$rn);
return $rnn;
}
exit;
***解説 [#pf1452ae]
7: @r = ();
これは@rという空の配列を用意するお。8行目で初期値をセット...
10-12: for($i=0;$i<$m;$i++){ $r[$i+1]=root($r[$i]); }
ニュートン法を使って計算する部分は後述のrootっていうサブ...
13: print "$r[$m-1]";
これが計算したなかで一番近い値となる。$n=3,$m=20の場合小...
15: sub root{
[[C]]言語などの「関数」にあたるのがPerlの「サブルーチン...
16: my($rn,$rnn);
変数のネーミングがちょっと気に入らないけど、ここでは$rnは...
17: $rn = $_[0];
$_[0]にはn番目の値が引数として渡されているので、それをと...
18: $rnn = ($rn**2+$n)/(2*$rn);
ここがニュートン法の計算式で、なんでこうなるかは数学の範...
*数当てゲーム [#ffb233da]
#!/usr/local/bin/perl -W
use strict;
local $/;
print eval <DATA>;
__DATA__
$, = $\ = $/ = "\n";
my $flg = 1;
while($flg){
my $number = 1000 + int rand 9000;
while(<>){
$number==int&&last;
print$_>$number?'bigger...':'smaller...';
}
print 'hit!!','again? y/n';
while(<>){
/^y$/i&&last;
/^n$/i&&$flg--&&last;
}
}
'good bye';
何この邪悪なコード。ふざけてるの?
B:
$Ans = int rand 9000;
A:
print"入力=>";$_=<>;
printf"入力は答えより%sです\n",$_>$Ans?"大きい":"小さい";
&more if/$Ans/;goto A;
sub more{
print"正解です=>$Ans\n\nもう一回やる?y/n=>";
$_=<>;goto B if/y/;exit if/n/;
}
*配列いじり [#yefe9978]
print shift @ARGV;
print " ";
print "0 " while shift @ARGV;
実行例
perl test1.pl 3 5 2 4 2
結果例
3 0 0 0 0
↑"配列"いじりじゃないうえに、引数に0が含まれるとそこでル...
#!/usr/local/bin/perl
use strict;
$, = ", ";
$\ = $/;
my @aa = (3,6,2,4,2);
print @aa;
splice @aa,1,$#aa,(0)x$#aa;
print @aa;
*Base64 [#l20f091e]
use MIME::Base64;
$encoded = encode_base64('vipper');
$decoded = decode_base64($encoded);
[[CPANモジュールそのまんま:http://search.cpan.org/~gaas/M...
*Caesar暗号解読 [#o607f99e]
use strict;
my $words = "qdq-gi.q-a ziatmxxitmdqibtqi-ustbi ri.qmoqr...
my @answers=();
for (1 .. 30){ #全部で30文字なので30回ループする
$words =~ tr/abcdefghijklmnopqrstuvwxyz .,-/-abcdefghi...
push (@answers, $words) if $words =~ m/person/; #perso...
}
while (@answers){
print shift @answers;
print "\n";
}
#答えが1通りであることがわかってる場合は、8行目のpushの...
別解
#!/usr/local/bin/perl
use strict;
$\ = $/;
$_ = "qdq-gi.q-a ziatmxxitmdqibtqi-ustbi ri.qmoqrcxi.qbu...
y/abcdefghijklmnopqrstuvwxyz .,\-/bcdefghijklmnopqrstuvw...
print;
解が複数あると仮定するなら、
#!/usr/local/bin/perl
use strict;
$\ = $/;
my $c = "qdq-gi.q-a ziatmxxitmdqibtqi-ustbi ri.qmoqrcxi....
($_ = $c) && y/abcdefghijklmnopqrstuvwxyz .,\-/bcdefghij...
*フィボナッチ数列 [#e5eb0915]
[[Math:Big:http://search.cpan.org/~tels/Math-Big-1.12/lib...
*真と偽 [#p7bf8db5]
[[とほほのperl入門(概要編) - ◆ 真(true)と偽(false) :htt...
*スタック [#d2cf07b1]
#!/usr/local/bin/perl -W
use strict;
my %calc = (
'+' => sub{pop(@{$_[0]})+pop@{$_[0]};},
'-' => sub{splice(@{$_[0]},$#{$_[0]}-1,1)-pop@{$_[0]};},
'*' => sub{pop(@{$_[0]})*pop@{$_[0]};},
'/' => sub{splice(@{$_[0]},$#{$_[0]}-1,1)/pop@{$_[0]};},
);
my @stack = ();
defined$calc{$_}?push@stack,&{$calc{$_}}(\@stack):sub{
my @x = @_;
$x[0] =~ y/[0-9\-]//c;
push@{$x[1]}, int$x[0] if $x[0] eq int$x[0];
}->($_,\@stack)for@ARGV;
print$stack[0];
*参考リンク [#of2e4318]
:[[Perl-users.jp - 日本のPerlユーザのためのハブサイト:htt...
モダンなPerl : 日本のPerlユーザのためのハブサイト
:[[perl-mongers.org:http://perl-mongers.org/]]|
モダンなPerl : OpenIDでログイン出来るPerlユーザblog。Perl...
:[[Perl「言語」初心者がモダンなPerlを高速に学ぶ方法 - dan...
plaggerのソースを読もう
:[[プログラミング言語Perl 詳細リファレンス - Perl入門~サ...
詳細なリファレンス、サンプルコード付き
::[[Perlという言語について - Perl入門~サンプルコードによ...
''Perlのバージョン5以降であればPerlできれいにプログラムを...
//このページの冒頭にでも書いた方が良いのかな、とも思った...
::[[Perlプログラマーの皆さん - Perl入門~サンプルコードに...
Perlをやっている人のブログへのリンク
ページ名: