#regex #perl #matching
#регулярное выражение #perl #соответствие
Вопрос:
У меня есть файл tsv, который содержит два столбца (называемые TG и ESP), которые имеют либо числовое значение, либо равны нулю. Я хочу отфильтровать файл и сохранить только те строки, которые либо имеют значение меньше 1, либо не имеют значения. Я написал следующий цикл while:
while (<FILE>) {
my $line = $_;
chomp $line;
my @c = split('t', $line);
my $TG = $c[34];
if ( $TG !~ /s/ || $TG > 1 ) { next; }
my $ESP = $c[39];
if ( $ESP !~ /s/ || $ESP > 1 ) { next; }
print "$linen";
По какой-то причине эти операторы if заставляют мою программу пропускать каждую строку в файле. Я хочу, чтобы операторы if пропускали только те строки, числовое значение которых больше 1. Есть идеи, что я делаю не так?
Комментарии:
1. Добавьте несколько операторов print по всему циклу while в виде трассировок, чтобы вы могли видеть, что делает программа и почему она принимает определенные решения. Умение отслеживать запущенную программу является одним из ключевых навыков программирования.
Ответ №1:
Вы пропускаете, если одно из этих двух полей не содержит пробела
$TG !~ /s/
Поскольку в файле tsv нет такого понятия, как «нулевое» значение, возможно, вы просто хотите проверить, являются ли они числовыми, прежде чем выполнять сравнение?
next if $TG =~ /d/ amp;amp; $TG > 1;