Perl oneliner를 사용하여 특정 XML 요소에서 최대값을 찾는 방법은 무엇입니까?

Perl oneliner를 사용하여 특정 XML 요소에서 최대값을 찾는 방법은 무엇입니까?

다음 구문을 가진 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

관련 정보