Я новичок в Perl и пытаюсь применить условие фильтра к файлам XML с помощью модуля XML::Twig
.Как применить предложение IN в Perl, передав аргументы из командной строки
Ниже мой код:
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
my $SOURCEFILE = $ARGV[0];
my $FILELOCATIONIN = $ARGV[1];
my $twig = new XML::Twig(twig_handlers => { 'STOCKEXT/STOCK' => \&STOCK });
$twig->parsefile($FILELOCATIONIN.'/'.$SOURCEFILE.'.xml');
$twig->set_pretty_print('indented');
$twig->print_to_file($FILELOCATIONIN.'/'.$SOURCEFILE.'out.xml');
sub TRADE {
my ($twig, $STOCK) = @_;
foreach my $c ($STOCK)
{
$c->delete($STOCK)
unless
$c->att('origin') eq "HIGH_TRADE"
;
}
}
Ниже мой XML:
<STOCKEXT>
<STOCK origin = "HIGH_TRADE"/>
<STOCK origin = "HIGH_TRADE"/>
<STOCK origin = "HIGH_TRADE"/>
<STOCK origin = "LOW_TRADE"/>
<STOCK origin = "LOW_TRADE"/>
<STOCK origin = "AVERAGE_TRADE"/>
</STOCKEXT>
Отфильтрованный Выходной XML:
<STOCKEXT>
<STOCK origin = "HIGH_TRADE"/>
<STOCK origin = "HIGH_TRADE"/>
<STOCK origin = "HIGH_TRADE"/>
</STOCKEXT>
Теперь я застрял, как я хочу передать запятой -раздельный аргумент в командной строке, так что HIGH_TRADE
, а также AVERAGE_TRADE
станут legi timate STOCK
.
Как видно, в моем текущем коде я передаю два аргумента. Но я хочу передать три аргумента, третий должен быть условием фильтра в формате, разделенном запятыми.
Поэтому я ожидаю мой код, который будет использоваться в качестве
perl stock_filter.pl file_name.xml /opt/XML HIGH_TRADE,AVERAGE_TRADE
Третий аргумент будет расколоть и сверяется атрибута каждого элемента STOCK
origin
объявить его законным.
Это поможет в будущем изменить условия фильтра. Любое сложение или вычитание условия фильтра не изменят код.
Глобальный символ "% Keep" требует явного пакета name..error это метание ... Не понимаю, почему .. –
Понял ... вместо того, чтобы мой $ keep = map {$ _ => 1} origins_to_keep, это должен быть мой% keep = map {$ _ => 1} @origins_to_keep, так как он hash ... спасибо ... –
oops, исправлено в ответе – mirod