2015-01-23 3 views
2

나는 간단한 펄 스크립트를 가지고 있으며 "도시"라는 단어까지 모든 것을 제거하고 싶다. 또는 쉼표의 ","의 n 번째 항목 (내 경우에는 2 번째 항목)까지 모두 제거하십시오. 다음은 아래 보이는 것입니다.JSON 웹 응답의 일부를 삭제하려면 어떻게해야합니까?

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

편집 :

문자열과 일치 할 때 너무 많이하고있는 것을 봅니다. "도시"이전에 모든 것을 제거하는 문제를 해결했습니다. 나는 또한 지금과 같은 대체 기능을 변경하는 동안 내 $의 발견은,

my $find = ".*city"; 

로 변경되었습니다

$CMD =~ s/$find/city/; 
여전히 쉼표 또는의 n 번째 발생하기 전에 모두 제거하는 방법을 생각하지 않은

그 문제에 대한 문자/문자열.

+6

당신이 실제 JSON 파서를 사용하여 생각 해 봤나? ('도시'가 두 번째 필드라는 가정을 하드 코딩하는 대신 쉼표 등이 포함되지 않는다는 가정) – ruakh

+4

http://search.cpan.org/~makamaka /JSON-2.90/lib/JSON.pm – Paul

+1

조언 해 주셔서 감사합니다. 고맙습니다. –

답변

10

콘텐츠는 이므로 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

뭔가 당신이 v.s.을 유지하려면 어떤 오해가 아니라면

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

가 .. 트릭을 할해야 같은 풀다.

FYI, http://regexr.com/은 완전히 정규식 행복으로 이동합니다.

+0

참고 자료를 읽어 주셔서 감사합니다. 귀하의 예제는 실제로 두 가지 행동을하고 있지만, 나는 그것을 해부하고 거기서부터 계산할 수 있습니다. 전반적인 목표는 1을 수행하는 것입니다. 다른 로직을 사용하여 언제 내가 원하는지를 결정할 것입니다. –

+0

하지 마십시오.출력이 다른 순서로 되돌아 오는 경우, 당신은 망가졌습니다. –

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"); 
관련 문제