如何检查另一个不使用 perl -c 的 perl 脚本的语法? [复制]

Posted

技术标签:

【中文标题】如何检查另一个不使用 perl -c 的 perl 脚本的语法? [复制]【英文标题】:How to check syntax of a perl script inside another one not using perl -c? [duplicate] 【发布时间】:2016-07-03 08:58:14 【问题描述】:

我在 B.pl 中有 2 个 perl 脚本 A 和 B. 我想检查 A.pl 中是否有语法错误

我正在使用$result =`perl -c A.pl`;,但无法在$result 中获得输出。 我需要一个 perl 命令来做到这一点。你能帮忙吗?

【问题讨论】:

要捕获外部命令的输出,请参阅perlop 中的qx 运算符。有关更高级的捕获,另请参阅 Getting STDOUT, STDERR, and response code from external *nix command in perl。 【参考方案1】:

您可以捕获输出并检查字符串syntax OK

A.pl

#!/usr/bin/env perl

use warnings;
use strict;

main();
exit 0;

sub main 
    my ($stuff) = @_;
    # Syntax Error
    print $stufff;

    # Runtime Error
    pint $stuff;

    # Runtime Error
    print $stuff->foo();

B.pl

#!/usr/bin/env perl

use warnings;
use strict;
use Test::More;

for my $file ( qw( A.pl B.pl ) ) 
    # 2>&1 means redirect STDERR to STDOUT so we can capture it
    chomp(my ($result) = qx( /usr/bin/env perl -cw $file 2>&1 ));
    ok( $result =~ m|syntax OK|m, "$file compiles OK" )
        or diag( "$file failed to compile : $result" );


done_testing();

输出

perl B.pl
not ok 1 - A.pl compiles OK
#   Failed test 'A.pl compiles OK'
#   at B.pl line 8.
# A.pl failed to compile : Global symbol "$stufff" requires explicit package name at A.pl line 12.
ok 2 - B.pl compiles OK
1..2
# Looks like you failed 1 test of 2.

【讨论】:

【参考方案2】:
my $res = system("perl -c test.pl");
unless ($res) 
    print "OK\n";
 else 
    print "Syntax error!\n";

【讨论】:

作者说不行。并且 backtics 捕获 STDOUT,而不是 STDERR perl 报告错误。最好在发布之前检查您的代码。

以上是关于如何检查另一个不使用 perl -c 的 perl 脚本的语法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Perl 中使用 grep 检查字符串是不是存在 [重复]

如何在 Perl 中检查多个变量是不是为空

如何检查 Perl-CGI 应用程序中的所有错误(例如,使用 Perl 编译器或类似 lint 的工具检查,免费开源?)

如何检查 Perl 中的 DBI 查询是不是返回了多个记录?

Perl 如何将数组作为参数传递给另一个 Perl 脚本

在 Perl 脚本上使用另一个解释器运行代码