Perl 字符串比较

Perl String comparison

我正在尝试将一个字符串与另一个字符串进行比较。

如果它是一个包含东西的 JSON 结构,我想打印 "contains things"。 如果它是一个 JSON 结构,不包含东西,我打印 "empty" 如果它不在大括号“{}”之间,我会打印出有错误。

这是我所做的:

if($content =~ m/{.+}/){
    print "Contains things \n";
} elsif($content eq "{}"){
    $job_status{$url}="";
    print "empty \n";
} else {
    print "Error \n";
}

当我将"{}"传递给变量$content时,他没有进入"elsif",而是进入"else",并抛出错误。 我试图在 if 中使用“==”而不是 "eq",尽管我知道它用于数字。这时,他输入 "elsif",然后打印 "empty",就像他应该对 "eq" 做的那样,然后抛出:

Argument "{}" isn't numeric in numeric eq (==)". 

我可以使用 JSON 库,但我不喜欢。

感谢您的帮助!

比迪

对我有用。 $content 有换行符吗?试试 chomp $content;.

use warnings;
use strict;

my $content = '{}';
if($content =~ m/{.+}/){
    print "Contains things \n";
} elsif($content eq "{}"){
    print "empty \n";
} else {
    print "Error \n";
}

__END__

empty 

如果我在 {}:

之后添加换行符,我可以复制该行为
#!/usr/bin/perl
use strict;
use warnings;

my $content = "{}\n";

if($content =~ m/{.+}/){
    print "Contains things \n";
} elsif($content eq "{}"){
    print "empty \n";
} else {
    print "Error \n";
}

就是returns"Error",如果我把eq换成==,就是returnsempty,因为"{}" ] 和 "{}\n" 在数值上为 0。如您所述,会引发警告。

您可以在处理之前尝试 chomp $content

我可能最终会把它拆散:

unless ($content) {print "Error\n"};
$content =~ /{(.*)}/
my $resp = ;
if ($resp) {
 print "Contains Things ($resp)\n";
} else {
 print "Empty\n";
}

顶层 JSON 东西可以是对象 ({...}) 或数组 ([...]),但您只检查其中之一。如果你只是想看看它是否为空,我会检查字符串的长度:

chomp $possible_json;
if( $length $possible_json >= 3 ) { ... }

您也可以考虑 Randal Schwartz 的 regex for JSON parsing。它并不能处理所有事情,但通常足以处理简单的事情。