Perl 全球符号“$fh";需要明确的包名(您是否忘记声明“my$fh”?)

Perl 全球符号“$fh";需要明确的包名(您是否忘记声明“my$fh”?),perl,Perl,我将扩展名为.srt、.ass、.ssa、.txt的目录(非递归)中的文件与以下文件进行全局比较: my @subfiles = glob '*.srt *.txt *.ass *.ssa'; 然后,要为spumux编写xml子文件,我调用: WRITESUBXML()如下所示: sub WRITESUBXML { foreach my $i (@subfiles) { $SUBXMl="/users/dragonzero29/.wine/drive_c/mvtmp/

我将扩展名为.srt、.ass、.ssa、.txt的目录(非递归)中的文件与以下文件进行全局比较:

my @subfiles = glob '*.srt *.txt *.ass *.ssa';
  • 然后,要为spumux编写xml子文件,我调用:
    WRITESUBXML()如下所示:

    sub WRITESUBXML {
        foreach my $i (@subfiles) {
            $SUBXMl="/users/dragonzero29/.wine/drive_c/mvtmp/$subfiles[$i].xml";
            open(my $fh, '>', $SUBXMl) or die "Could not open file $SUBXMl $!";
            print $fh "<subpictures format=\"NTSC\">\n";
            print $fh "<stream>\n";
            print $fh "<textsub filename=\"$subfiles[$i]\"\n";
            print $fh "characterset=\"UTF-8\"\n";
            print $fh "fontsize=\"28.0\"\n";
            print $fh "font=\"/users/dragonzero29/.wine/drive_c/mvtmp/arial.ttf\"\n";
            print $fh "fill-color=\"yellow\"\n";
            print $fh "outline-color=\"LightGray\"\n";
            print $fh "outline-thickness=\"2.0\"\n";
            print $fh "horizontal-alignment=\"center\"\n";
            print $fh "vertical-alignment=\"bottom\"\n";
            print $fh "left-margin=\"60\"\n";
            print $fh "right-margin=\"60\"\n";
            print $fh "top-margin=\"20\"\n";
            print $fh "bottom-margin=\"30\"\n";
            print $fh "subtitle-fps=\"29.97\"\n";
            print $fh "movie-fps=\"29.97\"\n"; 
            print $fh "movie-width=\"720\"\n";
            print $fh "movie-height=\"480\"\n";
            print $fh "force=\"no\"/>\n";
            print $fh "</stream>\n";
            print $fh "</subpictures>";
            close($fh);
        }
    }
    
  • 当运行时,它会吐出:

    syntax error at /users/dragonzero29/cm2dvd_v2.pl line 309, near "$LANg ="
    Global symbol "$fh" requires explicit package name (did you forget to declare "my $fh"?) at /users/dragonzero29/cm2dvd_v2.pl line 312.
    Global symbol "$fh" requires explicit package name (did you forget to declare "my $fh"?) at /users/dragonzero29/cm2dvd_v2.pl line 313.
    Global symbol "$fh" requires explicit package name (did you forget to declare "my $fh"?) at /users/dragonzero29/cm2dvd_v2.pl line 314.
    Global symbol "$fh" requires explicit package name (did you forget to declare "my $fh"?) at /users/dragonzero29/cm2dvd_v2.pl line 315.
    Global symbol "$fh" requires explicit package name (did you forget to declare "my $fh"?) at /users/dragonzero29/cm2dvd_v2.pl line 316.
    Global symbol "$fh" requires explicit package name (did you forget to declare "my $fh"?) at /users/dragonzero29/cm2dvd_v2.pl line 317.
    Global symbol "$fh" requires explicit package name (did you forget to declare "my $fh"?) at /users/dragonzero29/cm2dvd_v2.pl line 318.
    Global symbol "$fh" requires explicit package name (did you forget to declare "my $fh"?) at /users/dragonzero29/cm2dvd_v2.pl line 319.
    Global symbol "$fh" requires explicit package name (did you forget to declare "my $fh"?) at /users/dragonzero29/cm2dvd_v2.pl line 320.
    Global symbol "$fh" requires explicit package name (did you forget to declare "my $fh"?) at /users/dragonzero29/cm2dvd_v2.pl line 321.
    syntax error at /users/dragonzero29/cm2dvd_v2.pl line 323, near "}"
    /users/dragonzero29/cm2dvd_v2.pl has too many errors.
    
    嗯,编辑让我成功地编译了脚本,我的dvd项目脚本一直工作到iso创建,但我注意到字幕xml文件甚至没有创建,所以最终的dvd没有子文件…啊:(请帮助。这里还有用于生成xml文件的代码,与上述代码一起使用

    foreach my $i(0 .. $#subxmlfiles) {
    system("spumux -s0 -m dvd -P 
    \"/users/dragonzero29/.wine/drive_c/mvtmp/$subxmlfiles[$i]\" < 
    \"/users/dragonzero29/.wine/drive_c/mvtmp/$MOVIe.MUXED.MPG\" > 
    \"/users/dragonzero29/.wine/drive_c/mvtmp/$MOVIe.MUXED.MPG\"\n\n");
    }
    
    foreach my$i(0..$#子XML文件){
    系统(spumux-s0-m dvd-P
    \“/users/dragonzero29/.wine/drive\c/mvtmp/$subxmlfiles[$i]\”<
    \“/users/dragonzero29/.wine/drive_c/mvtmp/$MOVIe.MUXED.MPG\”>
    \“/users/dragonzero29/.wine/drive_c/mvtmp/$MOVIe.MUXED.MPG\”\n\n“;
    }
    
    抱歉搞得一团糟,我还是不明白如何从TextMate输入代码
    请进入此空间。

    此部分语法不正确:

    foreach my $LANg = grep(/^EN/ || /^ES/,@subfiles) {
    print $fh "<subpicture lang=\"$LANg\"\n";
    }
    
    通过以下方式:

    print $fh <<'EOF';
    <vmgm />
    <titleset>
    <menus>
    <pgc>
    EOF
    

    print$fh如果出现语法错误,请忽略所有其他错误,并首先处理语法错误


    语法错误常常会使perl混淆您所处的范围;在这里,它无法解析每个$LANg的坏
    ,但确实看到了
    }
    ,并认为它结束了sub。因此,下面没有词法
    $fh

    的所有内容请编辑您的问题以正确格式化它,它的当前状态使它很难处理要读取错误消息中报告的行
    309
    ,并且无法知道该行是哪一行。我修复了您的格式设置,请检查输入标记(使用链接)查看我所做的,以供将来参考。可能的重复内容也供将来参考。在这里发布之前,始终在谷歌上搜索错误消息。始终首先修复最早的错误。在这种情况下:
    语法错误位于/users/dragonzero29/cm2dvd_v2.pl第309行,靠近“$LANg=”
    我否决了你的帖子,因为(再次)它并没有接近于回答这个问题。变量
    $i
    $j
    $k
    被识别为索引,并且在上下文中完全有效。在这种情况下,
    $i
    是一个文件路径,但仅作为数组索引使用一次。OP的代码错误比您描述的要多“变量$i、$j和$k被认为是索引,在上下文中完全有效。”我在哪里说的是无效的?我只是建议可以找到更好的名称,这样可以提供更多的语义价值。至于其他,我不认为这个网站应该被用作一个通用的“输入时的坏代码”->“输出时为您修复的代码”服务。我特别回答了问题中给出的错误(其他错误=>其他问题),并提供了关于如何改进其他内容的各种想法。你可以随意不喜欢我的做事方式,但谢谢你的评论。@Borodin,如果你不喜欢你看到的答案,请随意发布一个更好的答案。我相信这是处理你看到的问题的一个更好的方法,因为这样每个人都会看到所有可能的答案,并且都会感到失望ree向上/向下投票。不幸的是,您的评论无助于我改进我的解决方案(基于我在之前评论中解释的“框架”),所以我不能改变任何东西,但你可以提供另一个,在你眼中更好的解决方案,来修复你在别处看到的所有缺陷。非常感谢你现在的投入,我在哪里可以获得更多的实践和信息,如我所说:
    (?:EN | ES)
    对于grep?我故意不在这里讨论具体的语法错误;我想为那些被大量的
    全局符号
    错误所困扰的人们提供一个有用的答案,告诉他们重新定位自己的焦点
    foreach my $LANg (grep(/^EN/ || /^ES/,@subfiles)) {
        print $fh "<subpicture lang=\"$LANg\"\n";
    }
    
    foreach my $lang (grep { /^(?:EN|ES)/ } @subfiles) {
        print $fh "<subpicture lang=\"$lang\"\n";
    }
    
    print $fh "<vmgm />\n";
    print $fh "<titleset>\n";
    print $fh "<menus>\n";
    print $fh "<pgc>\n";
    
    print $fh <<'EOF';
    <vmgm />
    <titleset>
    <menus>
    <pgc>
    EOF