【问题标题】:Global symbol doesn't recognized on perlperl 无法识别全局符号
【发布时间】:2018-06-18 10:50:13
【问题描述】:

我收到一个错误,因为全局符号不占用。请帮我解决这个问题。

错误信息:

在字符串中,@@g 现在必须在 gsx.pl 第 5 行“echo Ra@@@g”附近写为 \@g 全局符号“@@g”需要在 ggg.pl 第 5 行显示包名。

use strict;
use warnings;

print "connect to Perforce Server\n";
my $connection=`echo Ra@@@g|p4 -u raj login`;
if ( !$connection ) {
    print "Failed to connect to Perforce Server\n";
    exit(1);
}

my $status = system("p4 sync");
if ($status == 0) {
    my $workon = system("workon demo_project");
    my $build = system("gmake –f Makefile bin");         
} else {
    exit 1;
}

【问题讨论】:

  • 你有什么 Perl 版本?在 5.18.2 中,我遇到了完全不同的错误,以及一个很好的警告:Possible unintended interpolation of @g in string at .... Global symbol "@g" requires explicit package name (did you forget to declare "my @g"?)
  • 这是为 sun4-solaris 构建的 perl,v5.6.0
  • 加入反斜杠echo Ra@@\@g | p4 -u raj login后现在可以工作了;
  • 5.6.0 18岁!
  • 我已编辑您的代码以修复缩进。不客气,但请以后自己做。明智的缩进是使代码易于理解的最佳方法之一。如果您要让一大群人阅读和理解您的代码,最好让他们尽可能轻松。

标签: perl system


【解决方案1】:

@g 被解释为@g 数组,因为反引号会插入包括数组在内的变量。

而且,错误信息几年前已经更改,看来您的 Perl 版本很旧。考虑升级它。

要将@g 用作反引号中的字符串,您需要转义at 符号:

my $connection = `echo Ra@@\@g | p4 -u raj login`;

【讨论】:

  • 感谢您的支持。
  • 哦,奇怪。评论被撤回。 @@ 不会以某种方式进行插值。我仍然会逃避他们而不是依赖这种行为。
【解决方案2】:

你想用这个实现什么:

echo Ra@@@g

如何使用:

my $tmp = 'Ra@@@g';
my $connection=`echo $tmp|p4 -u raj login`;

【讨论】:

  • 如果密码中包含空格、括号等仍然会失败
【解决方案3】:

qx`...` aka `...` 像双引号字符串(qq"..." aka "...")一样插入。

my $connection = `echo Ra\@\@\@g | p4 -u raj login`;

不过,理想情况下,密码应该是一个单独的变量。

use String::ShellQuote qw( shell_quote );

my $password = 'Ra@@@g';

my $cmd1 = shell_quote("printf", "%s", $password);
my $cmd2 = shell_quote("p4", "-u", "raj", "login");

my $connection = `$cmd1 | $cmd2`;

【讨论】:

    猜你喜欢
    • 2016-06-02
    • 2016-11-28
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    相关资源
    最近更新 更多