in reply to How to parse the zypper info output?

Zypper has a nice feature: you can use the -x option to get the output formatted as XML. Unfortunately, it doesn't help much for info (it just wraps each package into an element), but the output of lr is much nicer and easily parsable.
#!/usr/bin/perl use warnings; use strict; use feature qw{ say }; use XML::LibXML; my %repos; open my $lr, '-|', qw{ zypper -x lr }; my $dom = 'XML::LibXML'->load_xml(IO => $lr); for my $repo ($dom->findnodes('/stream/repo-list/repo')) { $repos{ $repo->{name} } = {alias => $repo->{alias}, url => $repo->findvalue('url')}; } open my $zypper, '-|', qw{ zypper info python-rpm-macros Mesa-libEGL1 libedit0 fontconfig-dev +el } or die $!; my ($package, $repository); while (<$zypper>) { if (/^Information for package (.*):/) { $package = $1; } elsif (/Repository\s+: (\S+)/) { $repository = $1; say join "\t", $package, $repository, @{ $repos{$repository} }{qw{ alias url }}; } }

map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]