今日の論点
|
今日の行程
|
「ラクダは醜い生き物だが,特定の作業をこなすには最適の生き物」
るーく | 「暗黒面の力の方が強いのでしょうか?」 |
よーだ | 「違う …… 暗黒面は心の中にたやすく生まれやすく陥りやすい …… 暗黒面に一度陥ればそれに食い尽くされる」 (S.W. Ep.V) |
(cf. E*cel 根絶は可能か? その他アンチゑくせる文書)
個葉 → 個体 野外実験結果の解析 |
個体 → 個体群 (1) 「自己間引き」再現 * |
|
個体 → 個体群 (2) 遺伝子の流れの計算 |
個体群 → 群落・群集 毎木調査結果の解析 |
この哲学ゆえに, たとえば Perl は「なんとーりもの書き方」 を許容する言語になっている.
``use strict''
)
なスタイルで書く
Perl は「テキストファイル」の取り扱いをもっとも得意としている. 今日もテキストファイルの読み書きだけを説明する. なお, E*cel などに拉致されているデータを解析したいときには, 「テキストファイルとして保存」 してそれを Perl に読みこませる.
logistic.pm
宮本さんの統計パッケージ Pstat 解説ペイジとか見よ
樹種 | 個体数 | MLL2 | MLL3 | AIC | (その結果) | 尤度比検定 | (その結果) |
ACM | 427 | 129.5 | 131.6 | 4.27 | 明るさ依存 | 0.0388 | 明るさ依存 |
ACP | 1266 | 507.7 | 520.0 | 24.51 | 明るさ依存 | 0.0000 | 明るさ依存 |
ACR | 235 | -6.1 | -5.9 | 0.41 | 明るさ無関係 | 0.5232 | 明るさ無関係 |
ACS | 185 | 166.1 | 176.2 | 20.28 | 明るさ依存 | 0.0000 | 明るさ依存 |
ACT | 206 | 90.7 | 95.9 | 10.26 | 明るさ依存 | 0.0000 | 明るさ依存 |
BTG | 105 | 11.3 | 16.8 | 11.01 | 明るさ依存 | 0.0000 | 明るさ依存 |
CLB | 373 | 412.6 | 423.2 | 21.11 | 明るさ依存 | 0.0000 | 明るさ依存 |
COC | 380 | -22.9 | -18.0 | 9.83 | 明るさ依存 | 0.0000 | 明るさ依存 |
COK | 156 | 192.8 | 192.8 | 0.00 | 明るさ無関係 | 1.0000 | 明るさ無関係 |
CRC | 1351 | 307.3 | 318.0 | 21.53 | 明るさ依存 | 0.0000 | 明るさ依存 |
CRJ | 144 | 118.4 | 118.5 | 0.23 | 明るさ無関係 | 0.6334 | 明るさ無関係 |
CRL | 1370 | 933.7 | 939.3 | 11.23 | 明るさ依存 | 0.0000 | 明るさ依存 |
CRT | 245 | 99.4 | 105.2 | 11.73 | 明るさ依存 | 0.0000 | 明るさ依存 |
CSC | 169 | -45.4 | -45.0 | 0.82 | 明るさ無関係 | 0.3638 | 明るさ無関係 |
FGC | 305 | 19.6 | 19.6 | 0.01 | 明るさ無関係 | 0.9318 | 明るさ無関係 |
FGJ | 1744 | 378.4 | 381.4 | 5.82 | 明るさ依存 | 0.0158 | 明るさ依存 |
FRL | 188 | 153.4 | 154.3 | 1.80 | 明るさ依存 | 0.1791 | 明るさ無関係 |
MLM | 238 | 153.3 | 161.6 | 16.58 | 明るさ依存 | 0.0000 | 明るさ依存 |
OSJ | 185 | 41.9 | 42.2 | 0.56 | 明るさ無関係 | 0.4548 | 明るさ無関係 |
PRV | 208 | 17.8 | 21.1 | 6.51 | 明るさ依存 | 0.0107 | 明るさ依存 |
QRM | 126 | -4.3 | -0.6 | 7.39 | 明るさ依存 | 0.0065 | 明るさ依存 |
QRS | 885 | -345.5 | -333.4 | 24.18 | 明るさ依存 | 0.0000 | 明るさ依存 |
STO | 1460 | 1027.7 | 1053.4 | 51.42 | 明るさ依存 | 0.0000 | 明るさ依存 |
ZZZ | 1219 | 392.7 | 437.3 | 89.11 | 明るさ依存 | 0.0000 | 明るさ依存 |
$name = "kubo"; # $name を "kubo" $full_name = $name." taku"; # $full_name は "kubo taku" $weight = 71.8; # 浮動小数点数 $bmi = $weight / 1.77**2; # 演算して代入
Perl では文字列と数値の区別がない (「文脈」によって判断される)
# 配列を初期化 @trees = ("イタヤカエデ", "サワシバ", "シナノキ"); push @trees, "エゾマツ"; # 最後尾に追加 $tree = shift @trees; # 先頭から削除して取り出し print $trees[0]; # "サワシバ" と表示 (0 から始まる)
# ハッシュを初期化 %tree_name = ( # キーと値をセット "QRS" => "コナラ", "FGJ" => "イヌブナ", "FGC" => "ブナ" "QRS number" => 318, "FGJ number" => 695, "FGC number" => "?" ); $tree_name{"FGC number"} = 115; # 上書き print $tree_name{"FGJ"}; # "イヌブナ" と表示 print $tree_name{"FGC number"}; # 115 と表示
「キー」→「値」というふうに 「辞書のようにひく」ことができる. 小型データベイスのようなもの.
$reference = \%tree_name;
# 条件分岐 if ($name eq "kubo") { # $name が "kubo" なら $number_kubo++; # $number_kubo を増加 } else { # もしそうでないなら $number_others++; # $number_kubo を増加 } # 倒置した書き方 print "Your BMI is too large" if $bmi >= 25.0;
foreach $tree (@trees) { # @trees のすべての要素に print "$tree\n"; # 改行をつけて表示 }
# 1 から 10 までの和を計算 $i = 1; $total = 0; while ($i < 11) { $total += $i; # $total に $i を加える $i++; # $i を増加 } # foreach $i (1 .. 10) {...} としてもよい # %tree_name からキーと値を全部取りだして表示 while (($key, $value) = each %tree_name) { print "$key : $value\n"; }
$_ = "kubo takuya"; # 特殊変数に代入 print "found" if m/kubo/; # もし kubo が含まれれば print "found" if m/KUBO/i; # 大文字小文字区別なし print "found" if m/^kubo/; # もし先頭が kubo であれば print "found" if m/ya$/; # もし末尾が ya ならば
$_ = "kubo takuya"; # 特殊変数に代入 s/k/K/g; # すべての k を K に s/(^.+)( )(.+$)/$3 $1/; # 入れ換え print; # taKuya Kubo と表示
初段 | ファイル読みこんで操作して書き出せる, スカラーを使える |
二段 | 配列・ハッシュを使える, 簡単な正規表現ならだいたいわかる |
三段 | 自作関数を書ける, ラクダ本 使える |
四段 | 参照を使える,
perldoc 使える
|
五段 | Perl 標準ライブラリ使える,
strict に書ける
|
六段 | 簡単なモジュールを自作できる, Perl ふうオブジェクト指向がわかる |
七段 | Perl を C で拡張できる,
自作モジュールが
CPAN
に受理される
|
八段 | Perl6 開発プロジェクトに参加・貢献する |
九段 | Larry Wall と友人づきあいする |
十段 | Larry Wall にとってかわる |
# 標準入力から読みこまれた内容をそのまま表示するだけ while (<>) { # 入力が続いてるかぎり繰りかえす print; }
# まったく同じ内容,特殊変数 $_ を明示的に書いてるだけ while ($_ = <>) { print $_; }
# 特殊変数ではなくふつーのスカラーに入れてもよい while ($line = <>) { print $line; } # この場合 $line は省略できない
# 標準出力 (画面とか) ではなく別のファイルに出力する open OUT, "> output.txt"; # 書き込み用に開く while (<>) { print OUT; # OUT に出力している } close OUT; # OUT を閉じて書き込めないようにする
# 標準入力から読みこんだファイルの書式が # 「樹種 直径2001年 直径2002年」と仮定する. # 読みこんだ行に成長量 (= 直径2002 - 直径2001) を加えて出力し, # 断面積合計もいっしょに計算していって最後に表示する. # BA とかいう指標計算専用のサブルーチン (C 言語でいう関数) sub calc_ba { my ($dbh) = @_; $ba = $dbh * $dbh * 3.1416 * 0.25; return $ba; } # まとめて初期化 ($total_ba_2001, $total_ba_2002) = (0.0, 0.0); # ファイル読みこんで計算するループ while (<>) { # 入力が続いてるかぎり繰りかえす chomp; # 行末の改行マークを削除 next if m/^#/; # 行頭が # だったらその行はとばす ($species, $dbh2001, $dbh2002) = split; # 行の分割・代入 $growth = $dbh2002 - $dbh2001; # 成長量の計算 # 表示 print "$species $dbh2001\t$dbh2002\t"; printf "%.2f\n", $growth; # 書式つき出力 # BA なる指標の計算していく $total_ba_2001 += calc_ba($dbh2001); # サブルーチン calc_ba $total_ba_2002 += calc_ba($dbh2002); # を呼び出している } # 書式つき出力 printf を用いる print "----------------------------\n"; printf "TBA %.2e %.2e\n", $total_ba_2001, $total_ba_2002;
# tree_name.txt に記されている樹種略号⇔和名の対応を記憶して # それを樹木サイズデータといっしょにして output.txt に出力. ($tree_name_file, $dbh_file) = ("tree_name.txt", "dbh.txt"); open NAME, $tree_name_file or die "ERROR: Can't open $tree_name_file"; %tree_name; while (<NAME>) { # NAME から読みこむ chomp; # 行末の改行マークを削除 next if m/^#/; # 行頭が # だったらその行はとばす ($short_name, $name) = split; # 分割 $tree_name{$short_name} = $name; } close NAME; open DBH, $dbh_file or die "ERROR: Can't open $tree_name_file"; open OUT, "> output.txt"; while (<DBH>) { # DBH から読みこむ chomp; # 行末の改行マークを削除 next if m/^#/; # 行頭が # だったらその行はとばす ($short_name, $dbh2001, $dbh2002) = split; printf OUT "%-8s\t", $tree_name{$short_name}; print OUT "$_\n"; } close DBH; close OUT;