Sgf2dg和Perl:在模式匹配中使用未初始化的值$ _(m //)

时间:2016-07-16 15:34:20

标签: perl

正如我的问题标题所示,我遇到了以下问题:

  

在模式匹配(m //)

中使用未初始化的值$ _
Sgf2Dg.pm的第1416行

的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])

2 个答案:

答案 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

  1. sgf2dg的默认安装: 更新系统并使用autoremove卸载未使用的软件包。然后运行

    apt-get install sgf2dg
    apt-get remove sgf2dg
    

    apt然后将标记autoremove的几个程序包,但是您想保留它们。再次使用apt将其标记为手动安装。
    然后添加

    apt-get install libfile-slurp-perl
    

    因为您以后需要它。

  2. 下载并安装最新版本

    浏览to cpan以下载并安装最新版本的sgf2dg
    如果Makefile出错,则可能有助于删除其中仅包含' '的空行。

  3. 修复已安装的Perl文件
    找到文件

    find / -name Sgf2Dg.pm
    

    并按照上述解决方案的建议对其进行修复。这将修复代码中的-break错误。

  4. (可选)用于注释Go图的高级命令
    检查建议here on tex.stackexchange.com