読者です 読者をやめる 読者になる 読者になる

Awesome Hacks!

プログラミング初心者なので地道に勉強していきます。分からない人の立場から整理していきます。

perlを書いてみる(1)

プログラミング_Perl

※ここに書いたコードはperl初心者が試行錯誤の上記述したものです。最もスマートな方法とは限りませんので、ご了承ください。
 
CGIを作ってみる2 - Awesome Hacks!
の、
Perl基礎文法最速マスター - サンプルコードによるPerl入門 〜 安定と信頼のPerlを学ぼう 〜
Perl入門 - 第1回 Perlの文法の基本:ITpro
を参考にしながら、
練習問題 - プログラミングスレまとめ in VIP
の問題を解いてみる。
 

perlの実行

まず先に、簡単なperlを実行してみる。 

$ clear

$ cat List1.pl 
#!/usr/bin/perl
print "Hello World\n";
$ perl List1.pl 
Hello World
$ ll List1.pl 
-rw-r--r--@ 1 user  staff  39 11 20 06:43 List1.pl
$ chmod a+x List1.pl 
$ ll List1.pl 
-rwxr-xr-x@ 1 user  staff  39 11 20 06:43 List1.pl
$ ./List1.pl 
Hello World
$ 


結果
f:id:tamaking01:20141124204233p:plain
 
 

perlでループ処理

次に、実際に問題「ループ練習」にトライ
 

Hello World」を5回表示

解答が無いので以下に記述。

#!/usr/bin/perl

# 事前に文法チェック
use strict;

for (my $i = 0;$i < 5;$i++) {
	print "Hello World\n";
}


結果
f:id:tamaking01:20141124204251p:plain
 

引数によるループ回数指定分メッセージ出力

f:id:tamaking01:20141124211145p:plain

#!/usr/bin/perl

use strict;

my $INPUT = $ARGV[0];
for (my $i = 1;$i <= $INPUT;$i++){
    print "$i回目のメッセージ出力\n"
}

 

FizzBuzz問題について

自分で書いてみたのは以下。これでも正解だろうが、記載された解答はもっとスマート(割愛)

#!/usr/bin/perl

use strict;

for (my $i = 1;$i <= $ARGV[0];$i++){
	if ( $i % 3 eq 0 ) {
		print "Fizz"
	}
	if ( $i % 5 eq 0 ) {
		print "Buzz"
	}

	if ( $i % 3 ne 0 && $i % 5 ne 0 ){
		print "$i"
	}

	print " "
}

print "\n"


出力結果:

$ ./FizzBuzz.pl 35
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz 31 32 Fizz 34 Buzz 
$ 

 
 

素数判定

素数の定義は、確か
「1とその数以外では割れない数」
 
以上を踏まえて与えられた数までの素数が表示されるようなコードを書いてみる
 

#!/usr/bin/perl
 
use strict;
 
LOOP:for $_(1..$ARGV[0]){
    for my $num(1..$_ ) {        
        # 1からその数までを一つずつチェック(途中で割り切れた時にその数をチェック)
        if ( $_ % $num eq 0 ) {
            if ( $num ne 1 && $num ne $_ ) {    # 割り切れた数が1とその数以外だった場合
                print "x ";
                next LOOP;   # 多重ループをスキップする(LOOPラベル次処理へ)
            }
        }
    }
    print "$_ "      # 「$_」が素数の時だけここに来る
}
print "\n";
 


出力結果:

$ ./sosu.pl 30
1 2 3 x 5 x 7 x x x 11 x 13 x x x 17 x 19 x x x 23 x x x x x 29 x 
$


備忘録として、現在の処理時間をメモしておく。
※「time」コマンドは引数に指定したコマンドの処理時間を出力してくれる。

$ time ./sosu.pl 1000
1 2 3 x 5 x 7 x x x 11 x 13 x x x 17 x 19 x x x 23 x x x x x 29 x 31 x x x x x 37 x x x 41 x 43 x x x 47 x x x x x 53 x x x x x 59 x 61 x x x x x 67 x x x 71 x 73 x x x x x 79 x x x 83 x x x x x 89 x x x x x x x 97 x x x 101 x 103 x x x 107 x 109 x x x 113 x x x x x x x x x x x x x 127 x x x 131 x x x x x 137 x 139 x x x x x x x x x 149 x 151 x x x x x 157 x x x x x 163 x x x 167 x x x x x 173 x x x x x 179 x 181 x x x x x x x x x 191 x 193 x x x 197 x 199 x x x x x x x x x x x 211 x x x x x x x x x x x 223 x x x 227 x 229 x x x 233 x x x x x 239 x 241 x x x x x x x x x 251 x x x x x 257 x x x x x 263 x x x x x 269 x 271 x x x x x 277 x x x 281 x 283 x x x x x x x x x 293 x x x x x x x x x x x x x 307 x x x 311 x 313 x x x 317 x x x x x x x x x x x x x 331 x x x x x 337 x x x x x x x x x 347 x 349 x x x 353 x x x x x 359 x x x x x x x 367 x x x x x 373 x x x x x 379 x x x 383 x x x x x 389 x x x x x x x 397 x x x 401 x x x x x x x 409 x x x x x x x x x 419 x 421 x x x x x x x x x 431 x 433 x x x x x 439 x x x 443 x x x x x 449 x x x x x x x 457 x x x 461 x 463 x x x 467 x x x x x x x x x x x 479 x x x x x x x 487 x x x 491 x x x x x x x 499 x x x 503 x x x x x 509 x x x x x x x x x x x 521 x 523 x x x x x x x x x x x x x x x x x 541 x x x x x 547 x x x x x x x x x 557 x x x x x 563 x x x x x 569 x 571 x x x x x 577 x x x x x x x x x 587 x x x x x 593 x x x x x 599 x 601 x x x x x 607 x x x x x 613 x x x 617 x 619 x x x x x x x x x x x 631 x x x x x x x x x 641 x 643 x x x 647 x x x x x 653 x x x x x 659 x 661 x x x x x x x x x x x 673 x x x 677 x x x x x 683 x x x x x x x 691 x x x x x x x x x 701 x x x x x x x 709 x x x x x x x x x 719 x x x x x x x 727 x x x x x 733 x x x x x 739 x x x 743 x x x x x x x 751 x x x x x 757 x x x 761 x x x x x x x 769 x x x 773 x x x x x x x x x x x x x 787 x x x x x x x x x 797 x x x x x x x x x x x 809 x 811 x x x x x x x x x 821 x 823 x x x 827 x 829 x x x x x x x x x 839 x x x x x x x x x x x x x 853 x x x 857 x 859 x x x 863 x x x x x x x x x x x x x 877 x x x 881 x 883 x x x 887 x x x x x x x x x x x x x x x x x x x 907 x x x 911 x x x x x x x 919 x x x x x x x x x 929 x x x x x x x 937 x x x 941 x x x x x 947 x x x x x 953 x x x x x x x x x x x x x 967 x x x 971 x x x x x 977 x x x x x 983 x x x x x x x 991 x x x x x 997 x x x 

real	0m0.034s
user	0m0.027s
sys	0m0.005s
$ 

 
 
 
と、まあ基本的なところはこんな感じか。
しかし、これらでは不十分かつ、サイト上のものはアルゴリズムが自分には難解すぎるので、他の言語用の問題を引っ張ってきてperl向けに改変したものを今後記載していきたいなと考え中。
以後は次に委ねる。
次>> perlを書いてみる(2) - Awesome Hacks!