다음 구문을 가진 XML 파일이 있습니다
<element>
<id>0</id>
<tag1>something</tag1>
...
<tagn>something</tagn>
</element>
<element>
<id>1</id>
<tag1>something</tag1>
...
<tagn>something</tagn>
</element>
Perl 코드 중 'id' 요소에서 최대값을 찾는 한 줄은 무엇입니까?
저는 Perl을 처음 접했지만 다음을 수행하여 id 요소의 값을 얻을 수 있다는 것을 알고 있습니다.
perl -wne 'print $1 if /<id>(\d+)<\/id>/'
"0123456789"(숫자만 포함된 문자열?)를 생성합니다.
이 답변을 바탕으로https://unix.stackexchange.com/a/130903/374251일치 항목을 목록에 저장하고 목록의 최대값을 인쇄해 볼 수 있습니다. 그런데 이걸 한 문장으로 어떻게 표현해야 할지 모르겠습니다.
답변1
독립형 Perl 스크립트:
#!/usr/bin/perl
use strict;
use XML::LibXML;
use List::Util qw(max);
my $filename = './input.xml';
my $dom = XML::LibXML->load_xml(location => $filename);
my @ids = map { $_->to_literal() } $dom->findnodes('/data/element/id');
print max(@ids), "\n";
더 추악하고, 이해하기 어렵고, 편집하기 어려운 한 줄 버전:
perl -MXML::LibXML -MList::Util=max -e '
$dom = XML::LibXML->load_xml(location => shift);
@ids = map { $_->to_literal() } $dom->findnodes("/data/element/id");
print max(@ids), "\n";' input.xml
참고: 위의 두 가지 모두 <element>
s가 <data>
경로 내에 포함되어 있다고 가정합니다. 그렇지 않은 경우 findnodes()
실제 데이터에 맞게 함수 호출의 xpath를 조정하십시오 .
input.xml
다음 파일을 사용하여 실행합니다 .
<?xml version='1.0' encoding='UTF-8'?>
<data>
<element>
<id>0</id>
<tag1>something</tag1>
<tagn>something</tagn>
</element>
<element>
<id>1</id>
<tag1>something</tag1>
<tagn>something</tagn>
</element>
<element>
<id>2</id>
<tag1>something</tag1>
<tagn>something</tagn>
</element>
<element>
<id>3</id>
<tag1>something</tag1>
<tagn>something</tagn>
</element>
<element>
<id>4</id>
<tag1>something</tag1>
<tagn>something</tagn>
</element>
<element>
<id>5</id>
<tag1>something</tag1>
<tagn>something</tagn>
</element>
</data>
둘 다 올바른 결과를 얻었습니다 5.
location => $filename
그런데, 줄을 또는 다음으로 변경하여 두 버전 모두 STDIN을 읽도록 할 수 있습니다 location => shift
.
my $dom = XML::LibXML->load_xml(IO => *STDIN);
my
독립형 버전에서는 선택 사항 use strict
이지만 독립형 버전에서는 필수입니다.
그런데 명령줄에서 입력 파일 이름과 xpath를 지정할 수 있도록 스크립트를 수정하는 것도 쉽습니다. 이렇게 하면 max()
모든 xpath 요소의 값을 얻을 수 있는 범용 도구가 있습니다 . 예를 들어
#!/usr/bin/perl
use strict;
use XML::LibXML;
use List::Util qw(max);
my $dom = XML::LibXML->load_xml(location => shift);
my @ids = map { $_->to_literal() } $dom->findnodes(shift);
print max(@ids), "\n";
예를 들어 다음과 같이 실행합니다.
$ xml-max.pl input.xml /data/element/id
5