正如我的问题标题所示,我遇到了以下问题:
在Sgf2Dg.pm的第1416行在模式匹配(m //)
中使用未初始化的值$ _
的sgf2dg包。 它说:
} elsif (($arg eq '-break') or ($arg eq '-breakList')) {
my $breaks = '';
while (@ARGV and
$ARGV[0] =! m/[\d,]*/) {
$breaks .= shift @ARGV;
}
@{$option{breakList}} = sort {$a <=> $b} split(/,/, $breaks);
因此,我认为这个问题与模式匹配=! m/[\d,]*/
有关,但我不知道自己处理这个问题的时间是否足够perl
,也不足以向您展示一个简单的MWE: (
我已经安装了sgf2dg并且运行没有问题。我可以使用除-break
之外的所有选项,但那是我想要的选项。在Linux终端上:
sgf2dg -break 0 test.sgf
其中test.sgf
是典型的smart game format file。没有-break 0
选项,它运行没有任何问题。
为方便起见,我在这里附上一个sgf文件:
(;GM[1]FF[4]CA[UTF-8]AP[CGoban:3]ST[2]
RU[Japanese]SZ[19]KM[0.00]
AW[qm][oo][po][qo][ro][op][mq][oq][or]AB[pp][qp][rp][pq][pr]PL[W]
;W[rr]
;B[rs]
;W[rq]
;B[sp]
;W[ps]
;B[qs]
;W[os]
;B[qr]
;W[sq]
;B[sr]
;W[ss])
答案 0 :(得分:1)
这是代码中的一个错误。
$ARGV[0] =! m/[\d,]*/
实际上意味着$ARGV[0] = (! m/[\d,]*/)
,即将m/[\d,]*/
的否定结果分配给$ARGV[0]
。默认情况下m/[\d,]*/
与$_
匹配,但此时$_
未设置。
错误较少的代码为$ARGV[0] =~ m/[\d,]*/
([\d,]*
与$ARGV[0]
的匹配),但语义错误:[\d,]*
始终匹配,因此这种情况总是如此。
看起来它应该检查参数是否仅由数字和逗号组成,正确的代码为$ARGV[0] =~ m/\A[\d,]+\z/
。
但是,根据文档,-break
只接受一个参数,因此整个块可以替换为:
} elsif (($arg eq '-break') or ($arg eq '-breakList')) {
my $breaks = shift @ARGV;
@{$option{breakList}} = sort {$a <=> $b} split(/,/, $breaks);
答案 1 :(得分:1)
该问题已在线发布为错误报告:rt.cpan.org,但建议的解决方案是将一行替换为
my $breaks = shift @ARGV;
尚不清楚,无论如何对我都不起作用。
无论如何,我已按照以下步骤在新的Debian sgf2dg
发行版上安装了Buster
:
sgf2dg
的默认安装:
更新系统并使用autoremove
卸载未使用的软件包。然后运行
apt-get install sgf2dg
apt-get remove sgf2dg
apt
然后将标记autoremove
的几个程序包,但是您想保留它们。再次使用apt
将其标记为手动安装。
然后添加
apt-get install libfile-slurp-perl
因为您以后需要它。
下载并安装最新版本
浏览to cpan以下载并安装最新版本的sgf2dg
。
如果Makefile
出错,则可能有助于删除其中仅包含' '
的空行。
修复已安装的Perl文件
找到文件
find / -name Sgf2Dg.pm
并按照上述解决方案的建议对其进行修复。这将修复代码中的-break
错误。
(可选)用于注释Go图的高级命令
检查建议here on tex.stackexchange.com。