Emacs org-modeを使ってみる: (37) org-babel-perlを使う3/4

このエントリーをはてなブックマークに追加

今回は,org-babel-perlの使い方を説明する(三回目).
なおUbuntu 8.04 LTSとEmacs22上で, org-6.34c (2010年1月10日リリース)の利用を前提にしている.

表を入力とするプログラム

表を入力とするプログラムも記述できる.まず,以下のように「#+TBLNAME: table1」と記述して,入力となる表に名前を付ける.

#+TBLNAME: table1
|----+----------+--------+------|
|    | パソコン | ソフト | 通信 |
|----+----------+--------+------|
| Q1 |       30 |      5 |    2 |
| Q2 |        0 |     15 |    2 |
| Q3 |       50 |     20 |    2 |
| Q4 |        0 |      3 |    2 |
|----+----------+--------+------|

「#+BEGIN_SRC」のオプションとして, 「:var table=table1」で入力となる表を指定する.「table1」が表の名前,「table」がPerlの変数名である.
Perlプログラム中では,「 $table->[i]->[j] 」で i行j列目を取り出すことができる.ただし,横線も行としてカウントされている点に注意する.

#+BEGIN_SRC perl :results output raw :exports results :var table=table1
  foreach my $row (@$table)  {
      if (ref($row) eq "ARRAY") {
          my @d = @$row;
          my $sum;
          if ($d[0] =~ /^Q/) {
              map { $sum += $_ } @d[1..@d-1];
          } else {
              $sum = "合計";
          }
          print "|", join("|", @d, $sum), "|\n";
      } else {
          print "|-\n";
      }
  }
#+END_SRC

上のプログラムを実行すると,以下のように合計の列が追加された表が挿入される.

#+results:
|----+----------+--------+------+------|
|    | パソコン | ソフト | 通信 | 合計 |
|----+----------+--------+------+------|
| Q1 |       30 |      5 |    2 |   37 |
| Q2 |        0 |     15 |    2 |   17 |
| Q3 |       50 |     20 |    2 |   72 |
| Q4 |        0 |      3 |    2 |    5 |
|----+----------+--------+------+------|