Sunday, July 25, 2010

learning perl exercise 3

ex-3-1
#! /usr/bin/perl

@mylist = <STDIN>;
@mylist = reverse @mylist;
print "@mylist" ;

chomp(@mylist = <STDIN> ;)
としたら配列要素がつながって読みづらくなった。

最後の出力の後にも改行を入れようと思い、最初
print @mylist . "\n";
とやったらできなかった。

print "@mylist" . "\n";
だとできた。

UNIXでの標準入力の終わり「Ctrl + D」は1つの入力が終わった状態で打つ。

ex-3-2
#! /usr/bin/perl

@names = qw / fred betty barney dino wilma pebbles bamm-bamm /;
$n = @names - 1;
$message = "hit a number between 1 to $n";
print "$message" . ".\n";
chomp ($num = <STDIN>);

while (($num < 1) or ($num > $n)) {
 print "$message" . ", PLEASE.\n";
 chomp ($num = <STDIN>);
}

 $num = $num - 1;
 print "$names[$num]" . "\n";


0の入力の除外と要素数以上の数の入力があった場合のメッセージを入れようとしたらよくわからなくなった。でもこれだと文字を入力されたらダメだよなあ。とりあえず今は「1から$n以外の数字だったら」という条件の作り方がまだわからない。

ex-3-3
#! /usr/bin/perl

print "enter names you like. press Ctrl+D when you finish.\n";
@namelist = <STDIN>;

print "chomp? enter Y/N.\n";
chomp ($chomp = stdin);

if ($chomp eq Y) {
 foreach $namelist (@namelist) {
 chomp $namelist;
 }
 @namelist = sort @namelist; 
 print "@namelist" . "\n" ;
}

elsif ($chomp eq N) {
 @namelist = sort @namelist; 
 print "@namelist" . "\n" ;
}

これもY/N以外の入力に対して無力。Nの場合はY以外のどのキーでもOKのようにすればごまかせるのかな。あとchompしたほうの表示は全要素の前にスペースが入る。

【答えの一例を見ながら】

3-1
print reverse <STDIN>;
てやってもいいんですね。

3-2は、複数の数字を受け入れる想定だったのか。

3-2
print sort <STDIN>;
もOK。

【もう一度ex-3-2】

#! /usr/bin/perl

@names = qw / fred betty barney dino wilma pebbles bamm-bamm /;
$n = @names - 1;
print "hit some numbers between 1 to $n and ctrl+d when you finish.\n";
chomp (@nums = STDIN);

foreach $nums (@nums) {
print "$names[$nums - 1] \n";
}

教科書通りにやると最後のforeachの後の$numsを省略して{}の中では$_を使うことができる。
foreach (@nums) {
print "$names[$_ - 1] \n";
}

@numにきちんと指定範囲内の数が入力されたかどうかの判定を入れておかないとどうも落ち着かない。配列の中の文字判定はどうやってやるのだろうか。たぶん入力の段階で割り込んでやる感じなのだろうか。

foreachは「配列の要素をひとつずつスカラー変数に代入して、要素の最後まで{}内の作業をやりつづける」という理解。変数名を指定しない場合はデフォルトの$_に代入される。

スカラーは$calar。
配列は@rray。


【ex-3-3 again】
いろいろ変だったのでもう一度。

print "enter names you like. press Ctrl+D when you finish.\n";
@namelist = <STDIN>;

print "chomp? enter Y/N.\n";
chomp ($chomp = <STDIN>);

if ($chomp eq Y) {
 chomp @namelist;
 print sort @namelist ;
 print "\n";
}

elsif ($chomp eq N) {
 print sort @namelist ;
}

配列のchompは chomp @配列名 でできる。

演算子はクオーテーションの中では実行されずに文字として表示されるので
print "sort @list" . "\n";
はできない。

結果をchompするかの切り分けを最初に持ってくると print sort STDIN が使えてelseのところが少しすっきりしてちょっといい気分。
#! /usr/bin/perl

print "press Y if you like to chomp the result. if not, press any other key.\n";
chomp ($chomp = <STDIN>);

print "enter names you like. press Ctrl+D when you finish.\n";

if ($chomp eq Y) {
 chomp(@names = <STDIN>);
 print sort @names;
 print "\n";
}

else {
 print sort <STDIN>;
}

Wednesday, July 21, 2010

learning perl exercise 2

「初めてのPerl」を買いました。


初めてのPerl 第5版
初めてのPerl 第5版
posted with amazlet at 10.07.21
Randal L. Schwartz Tom Phoenix brian d foy
オライリージャパン
売り上げランキング: 23482


練習問題2.11

2.11-3
#! /usr/bin/perl
print "半径の長さを入力してください。\n";
chomp  ($hankei = <STDIN>);
if ($hankei > 0) {
$enshu = ($hankei * 2) * 3.141592654;
print "半径" . $hankei . "cmの円周の長さは、" . $enshu . "です。\n";
}
else {
$hankei = 0;
print "あなたが入力した半径は" . $hankei . "cmになりました。\n";
}

2.11-4
#! /usr/bin/perl
print "まず文字を入力。\n";
 $moji = <STDIN>;
print "何回繰り返す?\n";
 chomp  ($kaisu = <STDIN>);
print $moji x $kaisu;


2.11
  • $piで先に円周率を代入しておく方法。




  • 特別な理由がない場合は入力値はchompしておく。





  • 文字列演算子はピリオド。前読んだ本ではコンマだったような気もする。

    single-quoted string literalとdouble-quoted string literalの違いが理解できていない。backslash escapeで特殊文字?の入力ができるのがdouble-quotedで、さらに変数転換(variable interpolation)されるのもdouble-quoted。single-quotedはどういう時に使うのか?

    Saturday, July 17, 2010

    perlのパスが通るまで vol.3

    「パスを通す」というのは「コマンドサーチパスを設定する」ということらしい。思っていたのと少し違っていた。

    「コマンドサーチパスを設定する」ということは、シェルコマンドのように実行されるプログラム(コマンド?)がある場所(パス)をシェルにあらかじめ設定しおくということ。

    Terminal.appでコマンドを入力する時、それがあらかじめシェルに組み込まれたコマンドであれば実行されるが、自分で作ったプログラムの場合そのプログラムへのパスを登録しておかないと、プログラムの場所がわからず実行されないということでいいのか。それと権限。

    Command not foundの状態。権限がなければPermission deniedの状態。

    bashで設定するファイルはルートの?bash_profileとbashrcというファイル。



    参照:UNIXの基本コマンド

    (次回いよいよ設定)

    それにしても、シェルはアプリケーションなのか?じゃあコマンドサーチパスの設定はシェルに対してやっているのか?とかそういう基本的な要素のカテゴリ分けがよくわかっていない状態で説明しようとしている時点でいろいろとおかしくなる。あとで見直して笑える日が来ることを願おう。

    Wednesday, July 14, 2010

    perlのパスが通るまで vol.2

    perlまでのパスを調べる。

    % which perl
    

    /usr/bin/perl

    と出たのでhello.plの1行目に入れる。

    #!/usr/bin/perl
     print "こんちは\n";
    

    hello.plに権限を与える

    chmod 755 heollo.pl
    

    % ./hello.pl
    

    ./
    は「現在のディレクトリの」という意味。

    パスが通って「こんにちは」ができた。

    以前できなかった理由は、ディレクトリを移動してファイルに権限を与える作業のどこかで手順を間違えていたことだと思われる。

    ディレクトリ内のファイルやフォルダの一覧とその権限を見る。

    ls -l パス/ディレクトリ
    


    参照:
    Hello, world!

    Friday, July 9, 2010

    perlのパスが通るまで vol.1

    ディレクトリを移動して「perl ファイル名」だとできるが

    #!/usr/bin/perl
     
    

    のようにファイルの中にパスを通す?方法がよくわからない。
    通るようになるまでシリーズで。


    自分の環境:Mac OSX 10.6.4

    Terminal起動

    pwd
    print working directory 現在のディレクトリを表示。

    cd パス
    change directory

    cd ..
    ..は一つ上の階層。つまりひとつ上の階層に移動する。
    ..の前後にはスペースが入っている。

    cd
    cdのみだとホームディレクトリに移動

    ls
    list segments(ディレクトリの中身を表示)

    chmod
    change mode(パーミッションなどのファイルモードを変更する)

    mkdir 名前
    make directory

    mv
    move 移動と名前の変更

    man mv(mvのmanual表示)

    NAME
    mv -- move files

    SYNOPSIS
    mv [-f | -i | -n] [-v] source target
    mv [-f | -i | -n] [-v] source ... directory

    manで表示させたマニュアルから抜け出す方法がわからない。

    manでマニュアル表示させた後にそこから抜けるには

    % q

    コマンドの前には%を入れるとこれはコマンドですよ、ということになるのか。

    参照サイト
    wikipedkia/pwd
    Terminalを使ってみよう

    Thursday, July 8, 2010

    コードのフォーマット

    #!/usr/bin/perl
     print "こんちは\n";
     
    

    参考にさせてもらったのはBlogger でソースコードに色付けをする - google-code-prettify

    google-code-prettifyでダウンロードしたcssとjsをほとんど使っていないレンタルサーバーのサブドメインにアップして使用。

    Wednesday, July 7, 2010

    hello world!

    プログラムというものに興味を持ち始めた。とりあえず高校時代に友人たちとよくやったUNOのようなカードゲームを作ってみたいと思っています。

    初めてのプログラムはperlが簡単だと聞いたので、ここにはperlで学んだことなどを忘れないように書きためていこうと思っている。