2015-01-15 84 views
0

我想比较一个字符串到另一个。Perl字符串比较

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

这是我做了什么:

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

当我通过“{}”变量$内容,他并没有进入“ELSIF”,而是转到“其他”,并抛出一个错误。 我试图把“==”而不是“eq”放在if中,尽管我知道它是用于数字的。如果是这样,他进入“else if”语句,并打印“空”,就像他应与“EQ”做,并抛出:

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

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

感谢您的帮助!

比迪

+0

你做过其他调试吗?尝试打印$ content变量:'echo“'”。 $内容。 “'”;' – gmiley 2015-01-15 16:47:31

回答

1

它适用于我。 $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 
+1

谢谢!我的php文件(从中获得内容)没有任何'\ n'也没有空行,但chomp完美运行! – bidy 2015-01-16 08:27:36

1

我可以复制行为,如果我添加了{}后换行:

#!/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"; 
} 

它返回“错误”,如果我==取代eq,则返回empty,因为这两个"{}""{}\n"数值为0.正如你所提到的,会引发一个警告。

在处理它之前,您可能会尝试chomp$content

+0

您的回答是正确的!我在“如果”chomp($ content);' 之前用这一行删除了它,它解决了我的问题。工具先说它,所以我接受了他的回答,但你的也可以。 – bidy 2015-01-16 08:28:06

0

我可能会最终破坏它:

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

这样,你可以同时得到'Error'和'Empty'。 – choroba 2015-01-15 17:06:53

+0

你是对的,我试着不做2个正则表达式,并在获得内容的同时仍然得到一切。我只是没有想出一个干净的方式来实现这一点。 – ElectricWeasel 2015-01-15 20:33:09

1

顶级JSON啄可以是对象({...})或阵列([...]),但你只检查的一个那些。如果你只是想看看它是否是空的,我会检查字符串的长度:

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

您也可以考虑兰德尔·施瓦茨regex for JSON parsing。它并不处理所有事情,但对简单的事情来说,这已足够。