как я могу использовать условные в этом один вкладыш? - PullRequest
2 голосов
/ 29 ноября 2011

У меня есть входной файл с 3 столбцами, и я хотел напечатать строки, где 3-й столбец не был продублирован. так что если мои входные данные выглядят так:

0,1,abc
0,2,abc
0,5,xyz

Я бы напечатал:

0,1,abc
0,5,xyz

Я изначально начал с нижеприведенного, но ничего не получилось. что я делаю не так в этой строке?

perl -ne '/^[0-9]+,[0-9]+,(.+)/ && ++$a{$1} && print "$_ $a{$1}\n" if $a{$1}>0'

обратите внимание, что я не ищу решения своей проблемы, так как я кодировал его по-другому. но меня интересует, почему приведенная выше строка не выполняет то, что я ожидаю, так как она открывает пробел в моем понимании Perl.

Ответы [ 4 ]

2 голосов
/ 29 ноября 2011

Во-первых, выражение postfix if $a{$1} > 0 вычисляется первым, как если бы вы сказали

if ($a{$1} > 0) {
    /^"[0-9]+","[0-9]+","(.+)"/ && ++$a{$1} && print "$_ $a{$1}\n"
}

но $a{...}$1) будут обновляться только внутри блока if, поэтому оператор if никогда не выполняется.

Во-вторых, в вашем регулярном выражении есть символы двойной кавычки, а в примере ввода - нет. Это была опечатка?

0 голосов
/ 29 ноября 2011
perl -ne 'print if !$_{[m/([^,]*)$/]->[0]}++;'
0 голосов
/ 29 ноября 2011
perl -ne 'print "$_ $a{$1}\n" if /^[0-9]+,[0-9]+,(.+)/ && !$a{$1}++'
0 голосов
/ 29 ноября 2011
perl -ne '/^[0-9]+,[0-9]+,(.+)/ && ++$a{$1} ;print "$_" if $a{$1}==1'

То, что вы опубликовали, также включало печать значения $ a {$ 1}. Я предполагаю, что это было для отладки.

Я вынул "\ n", потому что уже есть перевод строки в $ 1.

Если вы хотите изменить это, используйте chomp в начале строки.

Хотя использование && в одной строке изящно, я думаю, что это будет хороший совет, чтобы попытаться написать Perl в реальном отформатированном блоке. Это будет помочь вам лучше учиться и легче отлаживать.

Глядя на вашу линию, не сразу легко увидеть, каково истинное намерение

print $_ if $a{$1}>0 

Лучший подход к обучению (на мой взгляд) был бы чем-то похожим на это:

perl -ne '/^[0-9]+,[0-9]+,(.+)/ and do{
   if ( ! exists $a{$1} ){
     print "$_";
   };
   $a{$1}=1;
}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...