2014-11-13 3 views
-1

Мой сценарий как этотКак группировать значения в foreach по условию?

use warnings; 
use strict; 
my @ar = <DATA>; 
for(my $i = 0; $i<=$#ar; $i++){ 
    $ar[$i] =~m/(\d+)$/g; 
    print "$ar[$i]\n" if ($& <= 15); 
    print "$ar[$i]\n" if ($& >100); 
    print "$ar[$i]\n" if ($& <40 && $& > 15); 
} 
__DATA__ 
hinsa 121 
mkzin 12 
mkva 34 
mvakine 2 
mzkev 9 
mkvvz 5 
mkhvzz 35 

Это дает выходы, но это не группа значение И.Ф. условия. и я также пробовал это

@ar = <DATA>; 
for(my $i = 0; $i<=$#ar; $i++){ 
    $ar[$i] =~m/(\d+)$/g; 
    print "$ar[$i]\n" if ($& <= 15); 
} 
for(my $v = 0; $v<=$#ar; $v++){ 
    $ar[$v] =~m/(\d+)$/g; 
    print "$ar[$v]\n" if ($& >100); 
} 
for(my $z = 0; $z<=$#ar; $z++){ 
    $ar[$z] =~m/(\d+)$/g; 
    print "$ar[$z]\n" if ($& <40 && $& > 15); 
} 

В этом коде второе условие не работает. Это дает выход:

mkzin 12 
mvakine 2 
mzkev 9 
mkvvz 5 

mkva 34 
mkhvzz 35 

Я ожидаю, что выход

mkzin 12 
mvakine 2 
mzkev 9 
mkvvz 5 
hisa 121 
mkva 34 
mkhvzz 35 

Как я могу это сделать? А также, пожалуйста, объясните, В моем сценарии 2 почему второе условие foreach не работает?

+1

Если это ваш фактический код, почему бы вам не исправить все эти ошибки первого? https://eval.in/220719 –

ответ

0

@Hussain: Когда вы пишете код perl, убедитесь, что используете use strict; и use warnings;. Я изменил ваш код perl и проблему с вашим кодом, вы пытаетесь сравнить неинициализированные $& value with a number. Поэтому он будет предупреждать о том, что use of uninitialized $& in numeric gt (>) так и так. Для этого я модифицировал со скалярной переменной, как показано ниже:

входного файла (test.txt):

hinsa 121 
mkzin 12 
mkva 34 
mvakine 2 
mzkev 9 
mkvvz 5 
mkhvzz 35 

Код:

use strict; 
    use warnings; 

    #Pass test.txt as an argument to the program 
    my $file = $ARGV[0]; 
    open (my $fh, "<", $file) || die "cant open file"; 

    my @ar = <$fh>; 

    for(my $i = 0; $i<=$#ar; $i++){ 
      my $temp = 0; 
     ($temp) = $ar[$i] =~ m/(\d+)/g; 
      print "$ar[$i]\n" if ($temp <= 15);   
     } 

    for(my $v = 0; $v<=$#ar; $v++){ 
      my $temp = 0; 
      ($temp) = $ar[$v] =~ m/(\d+)/g; 
      print "$ar[$v]\n" if ($temp > 100); 
     } 

    for(my $z = 0; $z<=$#ar; $z++){ 
      my $temp = 0; 
     ($temp) = $ar[$z] =~ m/(\d+)/g; 
     print "$ar[$z]\n" if ($temp <40 && $temp > 15); 
     } 
    close($fh); 

Выход:

mkzin 12 
mvakine 2 
mzkev 9 
mkvvz 5 
hisa 121 
mkva 34 
mkhvzz 35 
+0

Вы * предполагаете *, что каждое регулярное выражение успешно. –

+0

Я думаю, что по данным он успешный. Если есть ввод, в котором говорится «hisa 121 hello», тогда он выдает предупреждение. Я иду на рио или исправлю меня, если что-то не так? – Praveen

+0

@mpapec: Я изменил код сейчас. Если что-то не так с моим кодом исправить меня? – Praveen

0

Нет необходимости в таком сложном коде.

Эта программа работает, сохраняя каждую строку файла в соответствующем элементе массива @groups и печатая содержимое после того, как файл был прочитан.

Надеюсь, вы понимаете, что строки со значением от 40 до 100 не будут напечатаны вообще?

use strict; 
use warnings; 

my @groups; 
while (<DATA>) { 
    next unless /(\d+)/; 

    my $i; 

    $i = 0 if $1 <= 15; 
    $i = 1 if $1 > 100; 
    $i = 2 if $1 < 40 and $1 > 15; 

    push @{ $groups[$i] }, $_ if defined $i; 
} 

for (@groups) { 
    print for @$_; 
    print "\n"; 
} 

__DATA__ 
hinsa 121 
mkzin 12 
mkva 34 
mvakine 2 
mzkev 9 
mkvvz 5 
mkhvzz 35 

выход

mkzin 12 
mvakine 2 
mzkev 9 
mkvvz 5 

hinsa 121 

mkva 34 
mkhvzz 35