我有一个非常简单的例子来说明问题。在组织模式文件中考虑Perl中的以下代码块:
#+begin_src perl :results table
return qw(1 2 3);
#+end_src
它产生以下结果:
#+results:
| 1\n2\n3\n |
这并不完全令人满意,因为我期待一个完整的组织表。
例如,在Python中使用以下代码:
#+begin_src python :results table
return (1, 2, 3)
#+end_src
产生这个结果:
#+results:
| 1 | 2 | 3 |
所以这显然是在Python中工作但在Perl中没有。难道我做错了什么?这是一个已知的错误吗?
答案 0 :(得分:2)
因为今天早上我觉得自己有点自虐,所以我决定再次尝试黑客攻击。我制作了一个适用于你的例子的小修复,但我不能保证它会更复杂。所以它来了:
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\"
}")
如果您愿意,可以进一步修改以满足您的需求。
接下来就是babel中的perl-evaluate
方法没有通过进一步格式化来运行输出所以我修改了evaluate方法,从python-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个右括号)。
所以现在这样做是让perl打印列表类似于python打印它们的方式,并通过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
进行测试我没有比我给你的输出例子更进一步测试,所以如果其他例子行为不端,可以随意抱怨。