6

我在我的家用电脑上下载并设置了 PintOS 和依赖项,但是当我尝试运行时pintos run alarm-multiple,我得到了错误:

Unrecognized character \x16; marked by <-- HERE after if ($<-- HERE near column 7 at ~/code/pintos/src/utils/pintos line 911.

那条线上有^V同步空闲控制字符。我无法找到有关此问题的任何信息;好像只有我一个人经历过。

我安装了 Perl v5.26.0。

4

2 回答 2

12

在 Perl 5.20中不推荐在变量名中使用文字控制字符:

变量名中的文字控制字符

这种弃用会影响源代码$\cT\cT的文字控件(例如 aNAKNEGATIVE ACKNOWLEDGE字符)之类的东西。令人惊讶的是,最初这似乎是作为访问变量的规范方式,例如$^T,插入符号形式仅作为替代添加。

文字控制形式被弃用有两个主要原因。它有一些可能无法修复的错误,例如$\cI不能作为. [perl #119123]$^I$^T\cT

导致此问题的代码已在 2016 年通过此提交在PintOS 中修复:

committer Ben Pfaff <blp@cs.stanford.edu> 
Tue, 9 Feb 2016 04:47:10 +0000 (20:47 -0800)

Modern versions of Perl prefer a caret in variable names over literal
control characters and issue a warning if the control character is used.
This fixes the warning.

diff --git a/src/utils/pintos b/src/utils/pintos
index 1564216..2ebe642 100755 (executable)
--- a/src/utils/pintos
+++ b/src/utils/pintos
@@ -912,7 +912,7 @@ sub get_load_average {
 # Calls setitimer to set a timeout, then execs what was passed to us.
 sub exec_setitimer {
     if (defined $timeout) {
-       if ($\16 ge 5.8.0) {
+       if ($^V ge 5.8.0) {
            eval "
               use Time::HiRes qw(setitimer ITIMER_VIRTUAL);
               setitimer (ITIMER_VIRTUAL, $timeout, 0);

Perl 5.26使在变量名中使用文字控制字符成为致命错误

修复它的方法是确保您使用的是最新版本的 pintOS。该命令git clone git://pintos-os.org/pintos-anon应该这样做。

于 2017-08-13T11:22:32.047 回答
-1

^V是一个perlvar。由于我不知道的原因,它不是编码为^ V,而是编码为单个 unicode 字符,这导致程序失败。

于 2017-08-13T05:25:53.483 回答