我的内容如下:
"emailAddress":"akashu87@gmail.com","UserName":"Akash Udupa","active":true,"emailAddress":"coolrohit@rediffmail.com","UserName":"Rohit Hegde","active":true,"emailAddress":"manohar_k@rediffmail.com","UserName":"Manohar Karnam","active":true,"emailAddress":"satishgk@hotmail.com","UserName":"Satish GK","active":true
我想通过PERL仅在CSV文件中显示UserName的值,如下所示:
Akash Udupa
Rohit Hegde
Manohar Karnam
Satish GK
我相信你们会问我尝试了什么。问题是我对PERL很新。那么任何人都可以用perl代码帮助我吗?请。
提前致谢。
答案 0 :(得分:2)
有两种方法可以做到这一点;正确的方式,以及脆弱的方式。由于您的JSON的括号和括号被剥离,您已经开始走向脆弱的道路:
my $string = q{"emailAddress":"akashu87@gmail.com","UserName":"Akash Udupa","active":true,"emailAddress":"coolrohit@rediffmail.com","UserName":"Rohit Hegde","active":true,"emailAddress":"manohar_k@rediffmail.com","UserName":"Manohar Karnam","active":true,"emailAddress":"satishgk@hotmail.com","UserName":"Satish GK","active":true};
while ( $string =~ m/"UserName"\s*:\s*"([^"]+)"/g ) {
print "$1\n";
}
这将锚定到"UserName"
标记,并允许标记及其值之间的空格(但不要求它)。然后它会查找双引号,并捕获所有内容,直到下一个引用$1
。
Perl的正则表达式的简要介绍包含在Perl附带的perlrequick中。我的正则表达式解决方案没有使用该文档中未解释的任何构造。事实上,perlintro应该被认为是Perl用户需要阅读的,它提供了足以完成此任务的信息。
因为剥离JSON的逻辑可能已经破坏了某些东西,并且因为JSON可能会向你抛出一些我们的一次性正则表达式无法处理的东西,所以恢复原始未掺杂的JSON是明智的,并使用适当的解析器解析它,如下所示:
use JSON;
my $json = <<'EOJSON';
[
{
"emailAddress": "akashu87@gmail.com",
"UserName": "AkashUdupa",
"active": true
},
{
"emailAddress": "coolrohit@rediffmail.com",
"UserName": "RohitHegde",
"active": true
},
{
"emailAddress": "manohar_k@rediffmail.com",
"UserName": "ManoharKarnam",
"active": true
},
{
"emailAddress": "satishgk@hotmail.com",
"UserName": "SatishGK",
"active": true
}
]
EOJSON
print "$_->{UserName}\n" for @{decode_json($json)}
如果JSON模块对你来说太重了,请查看JSON::Tiny,这是最小的,经过良好测试且没有依赖性。
正则表达式和解析器方法都可以使用原始JSON,因此您可以通过删除从原始JSON中删除括号和大括号的部分来简化您的代码。完成后,JSON解析器解决方案可以是一行代码。幸运的是,删除代码可以在不删除功能的情况下使代码更加健壮。