Perl 打印变量和“;全局符号$XXX需要明确的包“;

Perl 打印变量和“;全局符号$XXX需要明确的包“;,perl,global-variables,packages,Perl,Global Variables,Packages,我有下面的Perl。它尝试检测Git克隆(与脱机zip相反)并打印回购信息。想法是,如果git rev parse失败,那么它可能不是git repo if (system "git rev-parse HEAD") { # Line 234 my $revision = `git rev-parse HEAD | cut 1-16`; # Line 235 my $branch = `git rev-parse --

我有下面的Perl。它尝试检测Git克隆(与脱机zip相反)并打印回购信息。想法是,如果
git rev parse
失败,那么它可能不是git repo

if (system "git rev-parse HEAD") {                         # Line 234
    my $revision = `git rev-parse HEAD | cut 1-16`;        # Line 235
    my $branch = `git rev-parse --abbrev-ref HEAD`;        # Line 236
    print "Git repo: $branch ($revision)\n";               # Line 237
}                                                          # Line 238
它会导致以下错误。如果我正在解析并且正确,它应该可以工作

根据,
print“Git repo:$branch($revision)\n”
应该可以工作。基于此,Q&A建议使用
@
而不是
$
。我试图
打印“Git repo:@branch(@revision)\n”
,但它导致了相同的错误(使用不同的符号)

我有两个问题:

  • 为什么Perl认为变量是一个包

  • Perl有什么问题,如何修复


全局符号“@branch”需要在./Configure行237处显示包名。
全局符号“@revision”要求在./Configure第237行显示包名。

我无法测试您的脚本,但这部分应该是这样的:

if(`git rev-parse HEAD 2>&1` !~ /Not a git repository/) {
    chomp(my $revision = `git rev-parse HEAD | cut -c1-16`); 
    chomp(my $branch = `git rev-parse --abbrev-ref HEAD`);
    print "Git repo: $branch ($revision)\n";
}

系统在成功时返回
0
。因此,如果进入
if
块,则表示命令(本身)
git rev parse HEAD
失败。然后在
qx
(倒勾)中也会发生同样的情况。我怀疑这不是你想要的?至于你所犯的错误,我不知道。这意味着没有声明变量
$branch
,这很奇怪。您能否将代码简化为一个简短、可运行的程序来演示这个问题?使用问题中发布的代码(由于@zdim已经解释的原因,
if
中的逻辑颠倒),我无法重现您描述的错误。除了文本格式不好(在
$branch
$revision
结尾的换行符)之外,它对我来说非常适合。@zdim-谢谢。由于全局符号错误,我并没有走到那个么远(但我怀疑它)。我真诚地怀疑代码是否给出了那个些错误。错误抱怨您使用了两个未知数组变量
@branch
@revision
,而您发布的代码中没有此类数组变量。更可能的是,错误地生成这些错误的实际代码在第237行中有
@branch
@revision
(或者类似
$branch[0]
$revision[0]
)而不是
$branch
$revision
,并且您在此处重新键入时将其修复,但不是你的原始资料。