use

useとは

さてやっとプログラミングということで、いくつかのSiteを平行にみていって覚えていく方向で。
というわけで早速ここから。

http://d.hatena.ne.jp/perlcodesample/20080312/1205337470

よし変数と思ったら、しょっぱなに

use strict;
use warnings;
use Carp;

というのがあった。

とりあえず気にしなくていい気もするけど、useでググってみると

use strict;
use warnings;

とにかくこれを先に書けというのが多い。

use自体はモジュールをインポートするというようなことが書いてあるので、strictやwarningsというモジュールを使えるようにするんだろう。

http://www.rfs.jp/sb/perl/04/01.html#2%EF%BC%8E%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB

この辺みると、特定のサブルーチンだけインポート出来るということも書いてある。

useのほかにrequireというのもあるようで

http://iandeth.dyndns.org/mt/ian/archives/000592.html

今の時点ではむずかしくてよくわからないけど

use はコンパイル時に評価される - module load happens at comile time.
require は実行時に評価される - module load happens at run time.

これだけ覚えておけば何とかなるとみた。

strict

http://e8y.net/mag/002-strict/

要はコンパイルエラーを出してくれるということらしい。
いきなりmyとか書いてあるので次のテーマはこれだな。

warnings

http://www.geocities.jp/ky_webid/perl5/005.html
http://perl-mongers.org/2008/06/perl_-_use_warnings_-w.html

要するに警告をだしてくれるということらしい。
警告ということは動くことは動くがダメなんじゃないのというわけなので、どっちにしろ直せということだな。

Carp

http://www.gimmix.org/~nobuyuki/p_blog/article.php?id=636

use Carp;
dieとwarnの代わりになるモジュール。
craok (die の代わりに使用。行番号が取得できる。)
confess (die の代わりに使用。関数の呼び出しもとの情報が得られる)
carp (warn の代わりに使用。行番号が取得できる。)
cluck (warn の代わりに使用。関数の呼び出しもとの情報が得られる)
使い方はみな同じ。文字列を引数に取る。
システムエラーの場合は$!を文字列の最後につける。($!の後ろに改行はいらない。改行は含まれている。)
ユーザーに、コードの内部情報を見せたくないときは、die,warnを使用する
参照 http://perldoc.perl.org/Carp.html

要するにdieとwarnの代わりになるモジュールということらしいけども、今はまだわからないので気にしない。

とりあえず
use strict;
use warnings;
を書けということはいたるところに書いてあるのでつけなければならないというまとめ。

sub

myをちょっとみてると、ローカル変数とかスコープの話になってくるので、とりあえずmyに行く前にsubを勉強する。

http://d.hatena.ne.jp/perlcodesample/20080607/1212814714

* func_name は、サブルーチン名で、自分で決めます。サブルーチンの機能を表現する名前が良い名前です。
* Perlでは、C言語のように、引数の型、引数の個数を指定する必要はありません。すべてのサブルーチンは、sub func_name{ } と記述します。( 引数の型や、引数の個数は、実際に実行するときに決まります。 )
* Perlでは、C言語のように、前方宣言を行う必要はありません。利用する前、利用する後ろ、どこに書いてもかまいません。

この辺読んでると、JavaScriptとの違いはfunctionがsubになっただけにみえる。

http://www.geocities.jp/ky_webid/perl5/023.html

関数を呼び出す方法は、関数名に続けて ( ) を付けてやるだけです。実は ( ) を省略できる場合もありますが( print関数の方には付いていませんね?)、これは条件付きです。「put_version」のような名前が、関数名であることが明らかであれば、( ) を省略できます。先ほど少し出てきましたが、Perlスクリプトは上から下へ実行されます。このとき、いきなり「put_version」と言われて、それが関数名であることが既に分かっていればいいということです。上のスクリプトの場合には ( ) は省略できません。下のように書き換えると、 ( ) が省略できます。

ということは

#!/usr/bin/perl
use strict;
use warnings;


# 自作関数の定義
sub put_version{
    print "version: 1.00\n";
}

print "スクリプト開始\n";
put_version;               # 自作関数を呼び出す
print "スクリプト終了\n";
C:\MyWorks\Perl\sub>perl sub1.pl
スクリプト開始
version: 1.00
スクリプト終了

ほう。

#!/usr/bin/perl
use strict;
use warnings;


print "スクリプト開始\n";
put_version;               # 自作関数を呼び出す
print "スクリプト終了\n";

# 自作関数の定義
sub put_version{
    print "version: 1.00\n";
}
C:\MyWorks\Perl\sub>perl sub2.pl
Bareword "put_version" not allowed while "strict subs" in use at sub2.pl line 7.

Execution of sub2.pl aborted due to compilation errors.

ほほう。

この場合、上から下へ進む過程で、先に関数の定義が出てくるため、put_version を呼び出すときには、既に「put_version」が関数名であることが明らかになっています。ですから ( ) を省略できます。

なるほど。
先に関数定義されていれば()がいらないってことらしいが、つけないのになれていないので付けることにする。

ところで、他のところをいろいろみていると、決まって関数呼び出しには&を付けろと書いてある。

http://www.rfs.jp/sb/perl/02/07.html
http://www.komonet.ne.jp/~perl/chap9.htm
http://blog.livedoor.jp/dtm_world/archives/12860061.html

でも付けなくても動いてるのはなぜか。

#!/usr/bin/perl
use strict;
use warnings;


print "スクリプト開始\n";
put_version();               # 自作関数を呼び出す
print "スクリプト終了\n";

# 自作関数の定義
sub put_version{
    print "version: 1.00\n";
}

&がなくても動く。

C:\MyWorks\Perl\sub>perl sub3.pl
スクリプト開始
version: 1.00
スクリプト終了

なんでかなと思って調べてみたら

http://perldoc.jp/docs/perl/5.6.1/perlsub.pod

サブルーチンを呼び出すには:

NAME(LIST); # 括弧があれば & は省略可能
NAME LIST; # predeclared/imported されていれば括弧は省略可能


&NAME; # 呼び出されるサブルーチンのための @_ 作成する

と書いてある。

サブルーチンは、明示的な & というプリフィックスを付けて呼び出すことができます。最近のPerlでは & は省略可能であり、サブルーチンがあらかじめ宣言されている場合には括弧も省略できます。 defined() や undef() の引数として使ったような、単なる名前付きサブルーチンであるときの & は 省略可能ではありません。 &$subref() や &{$subref}() のような、サブルーチンの名前やリファレンスを使った間接的なサブルーン呼び出しを行いたいたいときにも & は省略することはできません。但し$subref->() の記法が問題を解決します。詳しくは perlref を参照してください。

書かなくてもいいけど書かなければならない場合があるというまとめ。

というわけで、ここでのサブルーチンはこのくらいで。

はじまらないPerl

はまった話

仕事から帰ってきてPC立ち上げたらいちいち何するにでもアプリの起動が遅くて何事かと思ったら、昨日やったこれで

http://d.hatena.ne.jp/lolstep/20080618/1213794804

環境変数

\\hogehoge\c$\xampp\perl\bin

これを入れたら、Vertual PC立ち上げてないときはPathが無いもんだからいちいち探しに行くという困った現象が起きた。

仕方が無いのでバッチファイルを作って実行することにした。

path=%path%;\\hogehoge\c$\xampp\perl\bin
cd C:\MyWorks\Perl

こんな感じ。
まあDOS窓が死んだらPathも消えるけどね。

まだはじまらないPerl(その1)

XAMPPのインストール

とりあえずPerlが無いことには始まらない。
後々データベースも使ってみたいし、なにかのサービスなんかも作ってみたいし、そうなるといろいろインストールするのがめんどくさそうなのでそれらが一体化してるものを探してみたところ、XAMPPというのが全部入ってて楽らしい。
楽をするというコンセプトに見事マッチしたのでこれに決定。

とりあえずこの辺を参考に。

http://www.thinkit.co.jp/free/article/0701/12/3/
http://www.y2sunlight.com/ground/?XAMPP%2F5.Perl%A4%CE%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB

まだはじまらないPerl(その4)

まだはじまらないPerl(その3)

エディタ

プログラムを書くのにさすがにメモ帳ではつらいだろうと思って探してみた。
いろいろあるみたいだけど、Notepad++というのが使いやすそうで気に入った。
メモ帳ではつらいと書いておきながらNotepad++を選んでしまったところに何らかの因縁めいたものを感じずにはいられない。

とりあえずこの辺を参考に。

http://drupal.0829.info/blog/113

まだはじまらないPerl(その2)

Perlのインストール

調べてみると、Perlは別に入れたほうが良いらしいのでそうすることに。

この辺を参考に。

http://www.y2sunlight.com/ground/?XAMPP%2F5.Perl%A4%CE%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB

環境変数はネットワーク越しなので

\\hogehoge\c$\xampp\perl\bin

と設定してみた。

コマンドプロンプトからppmを叩くと以下のような画面が出るらしい。

で、ppmと叩くがこない。
正確にはきたけどリストの中身が全部空。

右上のギアみたいなアイコンを押すと以下のようになっている。

一方サーバ側ではこうなっている。

ネットワーク越しなのでなんとなくそうしないとダメだろうなということでいちばん上をチョイス。

キタ━━━━(゜∀゜)━━━━けどちょっと違う。
この時点でppmとやらがなんなのかまったく不明だけどとりあえず気にしない。
おそらくライブラリかなんかだろう。

とりあえずうごくかテスト。
プログラムはこれを参考に。というか丸コピ。

http://www.tohoho-web.com/wwwperl1.htm#AboutPerl

C:\>perl -e "print 'Hello world!!';"
Hello world!!

うごいた!

ファイルに保存して実行してみる。

この環境のパスはこれらしいので

/xampp/perl/bin/perl

それを一番上に書く。

#!/xampp/perl/bin/perl
print "Hello world!!\n";
C:\>perl hello.pl
Hello world!!

うごいた!

次にライブラリが動くかテスト。
どれがライブラリなのかわからないのでとりあえずこのソースをコピペ。

http://d.hatena.ne.jp/perlcodesample/20080312/1205337470

C:\>perl variable.pl
1: スカラー型( ひとつの数値を含む )
$number = 1
2: スカラー型( ひとつの文字列を含む )

$string = tow

3: 配列型は、複数の値を含む
@array = ( 1, tow, 3 )

3: ハッシュ型は、キーと値がセットになった複数の値を含む
%hash = (
       'key2' => 2,
       'key1' => 1
     );

うごいた!

次、Perlパスの設定ってことで

これを

/xampp/perl/bin/perl

これに変えるらしい。

/usr/bin/perl

ここからダウンロード&インスコロール。

http://www.vector.co.jp/soft/winnt/util/se184746.html

リンク作成シェル拡張をダウンロードして使ってみたら、リンクシェルを消したらリンク元まで消えるという謎現象発生。

こわすぎるのでsourceforgeから最新を取得。

http://sourceforge.net/project/platformdownload.php?group_id=171259

今度はリンクシェル消してもリンク元が消えなくて大丈夫。

再度パスを

/usr/bin/perl

これに変えて再実行。

C:\>perl variable.pl
1: スカラー型( ひとつの数値を含む )
$number = 1
2: スカラー型( ひとつの文字列を含む )

$string = tow

3: 配列型は、複数の値を含む
@array = ( 1, tow, 3 )

3: ハッシュ型は、キーと値がセットになった複数の値を含む
%hash = (
      'key2' => 2,
      'key1' => 1
    );

うごいた!

とりあえずこれでうごく環境は整った。