我有一个简单的Perl脚本,我想要删除“city”这个词。或删除逗号“,”的第n次出现(在我的特定情况下为第2次)的所有内容。这是下面的内容。
#!/usr/bin/perl
use warnings;
use strict;
my $CMD = `curl http://ip-api.com/json/8.8.8.8`;
chomp($CMD);
my $find = "^[^city]*city";
$CMD =~ s/$find//;
print $CMD;
输出是这样的:
{"as":"AS15169 Google Inc.","city":"Mountain View","country":"United States","countryCode":"US","isp":"Google","lat" :37.386,"lon":-122.0838,"org":"Google","query":"8.8.8.8","region":"CA","regionName":"California","status":"success","timezone":"America/Los_Angeles","zip":"94035"}
所以我想放弃
" {"as":"AS15169 Google Inc.","
或放弃
{"as":"AS15169 Google Inc.","city":"Mountain View",
我发现在匹配字符串时我做得太多了。我在“城市”之前删除所有内容,简化了我的问题修复。我的$ find已更改为
my $find = ".*city";
虽然我也像这样更改了替换功能,
$CMD =~ s/$find/city/;
仍然没有想出如何在第n次出现逗号或任何字符/字符串之前删除所有内容。
答案 0 :(得分:10)
您获得的内容为JSON,因此您可以轻松将其转换为Perl数据结构,使用它,甚至可以根据需要将其转换为JSON。这才是重点!而且,它很容易:
use Mojo::UserAgent;
use Mojo::JSON qw(decode_json encode_json);
my $ua = Mojo::UserAgent->new;
my $tx = $ua->get( 'http://ip-api.com/json/8.8.8.8' );
my $json = $tx->res->body;
my $perl = decode_json( $json );
delete $perl->{'as'};
my $new_json = encode_json( $perl );
print $new_json;
Mojolicious非常棒。即使没有用户代理的东西,这也是我处理JSON的首选方式。如果直接使用JSON字符串,则在元素顺序更改或包含宽字符时可能会出现问题。
答案 1 :(得分:2)
您不必使用Mojolicious手动decode_json()
。只需这样做:
my $tx = $ua->get('http://ip-api.com/json/8.8.8.8');
my $json = $tx->res->json;
my $as = $json->{as}
你甚至可以使用JSON指针:
my $as = $tx->res->json("/as");
答案 2 :(得分:-1)
像
这样的东西#!/usr/bin/perl -w
my $results = `curl http://ip-api.com/json/8.8.8.8`;
chomp $results;
$results =~ s/^.*city":"\w+\s?\w+",//g;
print $results . "\n";
应该做的伎俩..除非你对你想要保持什么有误解。除去。
仅供参考,http://regexr.com/完全可以让我获得正则表达式的快乐。