今朝は少しマゾヒスティックな気分だったので、もう一度 Lisp をハッキングしてみることにしました。あなたの例で機能する小さな修正を作成しましたが、より複雑なもので機能するとは約束できません。だからここに来ます:
org-babel は各言語のラッパーを定義します。perlのものはbabelがリストとして検出するものを生成しなかったので、私はそれを修正しました。すべてをテーブルとしてフォーマットしないようにするために、結果がテーブルとして印刷可能かどうかを確認する必要がありました。
(setq org-babel-perl-wrapper-method
"
sub main {
%s
}
@r = main;
open(o, \">%s\");
if ($#r > 0) {
print o \"(\",join(\", \",@r), \")\",\"\\n\"
} else {
print o join(\"\\n\", @r), \"\\n\"
}")
必要に応じて、ニーズに合わせてこれをさらに変更できます。
次のことはperl-evaluate
、babel のメソッドが出力をさらにフォーマットして実行しないことです。そのため、python-evaluate
コードから新しい部分を取得して evaluate メソッドを変更しました。
(defun org-babel-perl-table-or-string (results)
"Convert RESULTS into an appropriate elisp value.
If the results look like a list or tuple, then convert them into an
Emacs-lisp table, otherwise return the results as a string."
(org-babel-script-escape results))
(defun org-babel-perl-evaluate (session body &optional result-type)
"Pass BODY to the Perl process in SESSION.
If RESULT-TYPE equals 'output then return a list of the outputs
of the statements in BODY, if RESULT-TYPE equals 'value then
return the value of the last statement in BODY, as elisp."
(when session (error "Sessions are not supported for Perl."))
((lambda (raw)
(if (or (member "code" result-params)
(member "pp" result-params)
(and (member "output" result-params)
(not (member "table" result-params))))
raw
(org-babel-perl-table-or-string (org-babel-trim raw))))
(case result-type
(output (org-babel-eval org-babel-perl-command body))
(value (let ((tmp-file (org-babel-temp-file "perl-")))
(org-babel-eval
org-babel-perl-command
(format org-babel-perl-wrapper-method body
(org-babel-process-file-name tmp-file 'noquote)))
(org-babel-eval-read-file tmp-file))))))
新しい部分は、空行の間のorg-babel-perl-table-or-string
部分ですorg-babel-perl-evaluate
(最後に閉じ括弧が 1 つ追加されます)。
これで、Python がリストを出力するのと同じように perl がリストを出力し、出力結果を org-babel のフォーマット手順に通すことができるようになりました。
結果は次のとおりです。
リスト:
#+begin_src perl :results value
return qw(1 2 3);
#+end_src
#+results:
| 1 | 2 | 3 |
スカラー:
#+begin_src perl :results value
return "Hello test 123";
#+end_src
#+results:
: Hello test 123
このコードの使用方法:
- スクラッチと
M-x eval-buffer
テスト用に配置します
- 組織文書の先頭にある elsip src ブロックに配置します
- babel がロードされた後、.emacs に配置します。
- lisp/org フォルダーの ob-perl.el を変更します (後で org-mode を再コンパイルする必要がある場合があります)。
私が提供した出力例よりもこれ以上のテストは行っていないので、他の例で問題が発生した場合は、遠慮なく文句を言ってください。