Perl 全球符号“$fh";需要明确的包名(您是否忘记声明“my$fh”?)
我将扩展名为.srt、.ass、.ssa、.txt的目录(非递归)中的文件与以下文件进行全局比较: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/
my @subfiles = glob '*.srt *.txt *.ass *.ssa';
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