前回に続き lua を触ってみます。
lua はスクリプトファイルやコンパイルしたファイルを引数にする以外にも 実行する方法があります。
まずは perl などでもお馴染みのコマンドラインの引数に スクリプトを直接書く方法です。
$ lua -e "print(3)"
3
オプションは "-e" を指定します。
このような処理も書けます。
$ lua -e "for i=1,3 do print(i) end"
1
2
3
次は、対話型です。
引数を指定せずに lua コマンドを実行すると プロンプトが表示されて 対話モードになります。
$ lua >
対話モードを終了するには [Ctrl]+[c] します。
出力するには print() 関数以外にも = を使うことができます。
> print(3) 3 > = 4 4
"=" は return と同じです。 ([↑]キーでコマンド履歴を表示すると "=" は return になっています)
なので return でも出力できます。
> return 1 + 2
3
カンマで区切るとタブ区切りで出力します。
> print(1,2,3) 1 2 3 > = "a", "b", "c" a b c > return 3, 5, 7 3 5 7
Ubuntu10.04 での設定メモです。
(他の環境も一緒だと思いますが・・・)
デフォルトでは IPv6 を使用する設定になっているので netstat すると次のようになります。
$ netstat -ant | grep 22
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
sshd の設定ファイルを編集します。
$ sudo vi /etc/ssh/sshd_config
次の設定を追加します。
AddressFamily inet
sshd を再起動します。
$ sudo service ssh restart
これで IPv6 で LISTEN しなくなります。
$ netstat -ant | grep 22
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
[参考]
Apache HTTP Server 2.4.1 がリリースされました - Apache JP (2012/02/21)
ということなのですが、内容に「スクリプト言語 Lua を組み込むモジュール (mod_lua)」というのがあり、 巷で話題?の lua に触れてみました。
まずインストール。
Ubuntu 10.04 には lua50 というパッケージがあります。
$ sudo apt-get install lua50
これで lua 5.0.x が入ります。
コマンドは次のような感じです。
$ lua
lua lua50 luac luac50
lua コマンドが lua の実行で、luac がコンパイラのようです。
Java と似てますね。
対話形式もできるようですが、それはまた別の機会に。
とりあえず適当なソースを書いてみます。
$ vi test.lua
print(3)
実行してみます。
$ lua test.lua
3
コンパイルしてみます。
$ luac test.lua $ ls luac.out test.lua
"luac.out" というファイルができました。
実行してみます。
$ lua luac.out
3
コンパイルしたファイルの実行も "luac.out" 単体ではなく lua コマンドに食べさせるようです。
実行可能なスクリプトファイルにしてみます。
$ vi test2.lua $ chmod 755 test2.lua
#!/usr/bin/lua print(3)
実行してみます。
$ ./test2.lua
3
簡単ですね。
ちなみにコンパイルしたファイルを file すると コンパイルしたバージョンが表示されるようです。
$ file luac.out
luac.out: Lua bytecode, version 5.0
配列を宣言するときに、同じキーを使うことができてしまうため 次のように書くと後から書いたキーで上書きされてしまいます。
$array("1" => "a", "1" => "b"); print_r($a);
Array
(
[1] => b
)
また、配列は foreach で要素を順番に回すことができますが この「順番」というのは、キーの並びにはなりません。 ソートなどをしてない状態では、登録した順番になります。
$a[3] = "c"; $a[1] = "a"; $a[2] = "b"; foreach ($a as $key => $value) { echo $value; }
c a b
マップであることを考えれば当然なのですが インデックス型の配列だと思っていると間違えてしまうので注意が必要です。
ちょっと用語を整理しておきます。
このサイトだけの定義ですが、配列の添え字はキー、数字がキーの配列はインデックス型配列、文字列がキーの配列は連想配列と呼ぶことにします。 単に配列という場合は PHP の配列のことです。
PHP の配列は マップでインデックス型配列と連想配列を表現しているわけなんですが そのためか、キーが数字のみの文字列だったり、小数を含んだ数値だったりすると、変換されてしまうケースがあります。
キーに小数を含んだ数値を指定すると、小数部分が切捨てられ 整数部分のみキーとして使用されます。
$a[3.1] = "aaaa"; print_r($a);
Array
(
[3] => aaaa
)
キーにはマイナスの数値も指定できますが その場合も同様です。
$a[-2.5] = "bbbbb"; print_r($a);
Array
(
[-2] => bbbbb
)
次のようにすると、配列が上書きされてしまいます。
$a[3.1] = "3.1"; $a[3.2] = "3.2"; print_r($a);
Array
(
[3] => 3.2
)
キーに数字のみの文字列を指定すると 数値に変換されてインデックス型配列になります。
$a["13"] = "13a";
print_r($a);
Array
(
[13] => 13a
)
マイナスの場合も同様ですが、小数を含んだ数値の場合は 文字列として扱われます。
$a["-13"] = "13b"; $a["2.5"] = "2.5b"; print_r($a);
Array ( [-13] => 13a ["2.5"] => 2.5b )
1 つの配列に インデックス型配列と連想配列を混在させる場合 (あまり無いと思いますが) 文字列でキーを指定したつもりが 数値のキーを上書きしてしまうかもしれないので 注意が必要です。
オマケです。
$a[TRUE] = "TRUE"; $a[FALSE] = "FALSE"; $a[NULL] = "NULL"; print_r($a);
Array ( [1] => TRUE [0] => FALSE [""] => NULL )
PHP でプログラミングしていると 配列を非常に良く使います。 終始配列を操作してることもあるくらいです。 そんな PHP の配列について 復習も兼ねて書いていきたいと思います。
PHP の配列は、次の (1) のように 数字を添え字にした使い方と (2) のように文字列を添え字にした いわゆる連想配列やハッシュなどと呼ばれる使い方があります。
$a[2] = 3; //(1) $b['ten'] = 10; //(2)
配列の種類が 2 つあるように見えますが これは実は同じもので PHP の配列はキーに対して値を設定する マップになっています。
なので、上記の数字と文字列が添え字の配列を 1 つの配列にまとめることができます。
$a[2] = 3; //(1) $a['ten'] = 10; //(2)
関数の戻り値など以外で 配列を作るには array() や上記のような [] 指定を使います。 (array() は echo() などと同様に言語の要素なので通常の関数とはちょっと違います)
$a = array(1, 3, 7, 9);
上のように宣言した場合、添え字(キー)は 先頭から順に 0,1,2 …となります。 [] 指定だと次のようになります。
$a[0] = 1; $a[1] = 3; $a[2] = 7; $a[3] = 9;
文字列を添え字(キー)にするときは次のようにします。
$a = array("a" => 2, "b" => 4, "c" => 6);
これは次の指定と同じです。
$a["a"] = 2; $a["b"] = 4; $a["c"] = 6;
配列は、最初に書いたように混在させることができます。
$a = array(1, 3, "a" => 2, 7, "b" => 4, "c" => 6);
なぜ指定の異なるものを混在させることができるのでしょうか?
それは指定の少ない方(キーを宣言しない方)は 暗黙的にキーが指定されているのです。
つまりキー(添え字)を指定しない次の式は
$a = array(1, 3, 7, 9);
実は暗黙的に次のように指定していることになります。
$a = array(0 => 1, 1 => 3, 2 => 7, 3 => 9);
このようにして PHP は 1 つのマップで 数字を添え字にした配列と 文字列を添え字にした配列を使えるようにしているわけです。