Perl Regex Problem! - PullRequest
       1

Perl Regex Problem!

1 голос
/ 24 марта 2011

Я читаю строку из файла:

2343,0,1,0 ... 500 раз ... 3

Выше приведен пример$_ при чтении из файла.Это любое число, за которым следуют 500 разделенных запятыми 0/1, затем число 3.

while(<FILE>){
    my $string = $_;
    chomp($string);
    my $a = chop($string);
    my $found;
    if($string=~m/^[0-9]*\,((0,|1,){$i})/){         
        $found = $&.$a;
        print OTH $found,"\n";
        }   
}

Я использую chop, чтобы получить число 3 в конце строки.Затем сопоставляем первое число, за которым следуют $i вхождения 0 или 1. У меня проблема в том, что chop по какой-то причине не работает со строкой.В операторе if, когда я пытаюсь соединить совпадение и рубленое число, все, что я получаю, это содержимое $&.

Я также пытался использовать my $a = substr $a,-1,1;, чтобы получить число 3. Это тоже не сработало.

Странно то, что этот код работает в Eclipse в Windows, и когда япоставить его на сервер Linux, он не будет работать.Кто-нибудь может обнаружить глупую ошибку, которую я делаю?

Ответы [ 5 ]

2 голосов
/ 24 марта 2011

Как правило, я всегда допускаю невидимые пробелы в моих данных.Я считаю, что это делает мой код более надежным, ожидая, что кто-то не увидит лишний пробел в конце строки или строки (как при записи в журнал).Поэтому я думаю, что это решит вашу проблему:

my ( $a ) = $string =~ /(\S)\s*$/;

Конечно, поскольку вы знаете , что ищете число, лучше быть точнее:

my ( $a ) = $string =~ /(\d+)\s*$/;
1 голос
/ 24 марта 2011

Вместо того, чтобы пытаться сделать это таким образом, почему бы не использовать регулярное выражение, чтобы вытащить все, что вам нужно, за один раз?

my $x = "4123,0,1,0,1,4";
$x =~ /^[0-9]+,((?:0,|1,){4})([0-9]+)/;
print "$1\n$2\n";

Производит:

0,1,0,1,
4

Что довольномного чего вы ищете.Оба набора необходимых ответов находятся в переменных соответствия.

Обратите внимание, что я включил?: В начале 0,1, сопоставляя его так, чтобы он не не попадал в выводсопоставлять переменные.

1 голос
/ 24 марта 2011

Позаботьтесь о конце строки, я не могу проверить здесь, но я предполагаю, что вы просто рубите новую строку.Попробуйте сначала обрезать свою строку, а затем нарезать ее.См. Например http://www.somacon.com/p114.php

0 голосов
/ 24 марта 2011

Я не вижу особых причин использовать регулярные выражения в этом случае, просто используйте split .

use strict;
use warnings;
use autodie; # open will now die on failure

my %data;

{
  # limit the scope of $fh
  open my $fh, '<', 'test.data';
  while(<$fh>){
    chomp;
    s(\s+){}g; # remove all spaces

    my($number,@bin) = split ',', $_;
    # uncomment if you want to throw away the 3
    # pop @bin if $bin[-1] == 3;
    $data{$number} = \@bin;
  }
  close $fh;
}

Если все, что вы хотите, это 3

while(<$fh>){
  # the .* forces it to look for the last set of numbers
  my($last_number) = /.*([0-9]+)/;
}
0 голосов
/ 24 марта 2011

Я действительно не уверен, чего вы пытаетесь достичь, но я пробовал код на Win32 и Solaris, и он работаетВы уверены, что $ i - правильный номер?Может быть проще в использовании * или?

use strict;
use warnings;

while(<DATA>){
    my $string = $_;
    chomp($string);
    my $a = chop($string);
    print "$string\n";
    my $found;
    if($string=~m/^[0-9]*\,((0,|1,)*)/){         
        $found = $&.$a;
        print $found,"\n";
        }   
}



__DATA__
2343,0,1,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...