скрипт деления на Perl

У меня проблема со скриптом на Perl.

У меня есть текстовый файл в качестве входных данных

Hello -> good 0.1 0.2 0.3
Hello -> morning 1 2 0.6

скрипт делает разделение следующим образом: (выход)

Hello |||good ||| 0.1/0.2 0.2/0.3 2.718
Hello ||| morning ||| 1/2 2/0.6 2.718

Это мой текущий скрипт:

#!/usr/bin/perl

use strict;
use warnings;

use feature qw(:5.10);
my ($fichier1) = "fichier1.txt";

open my $FIC1, "<", $fichier1, or die "impossible ouvrir $fichier1 $! \n";
open(FICHIERNOUVELLES, ">resultat.txt");

while (my $line1 = <$FIC1>) {
    chomp $line1;
    my ($texte, $value1, $value2, $value3) = ($1, $2, $3, $4) if $line1 =~ /^([a-zA-ZÀÁÂÃÄÅÇÈÉÊËÌÍÎÏñœ=ÒÓÔÕÑÖæñßÙÚÛÜÝàáâãäåçèéêëìíîïðòóô-õöùúûüý@#-%&*_\s]+)([.\d]+)$/;

    my $tot_val1 =sprintf("%.15f", $value1 * $value2);
    my $tot_val2 =sprintf("%.15f", $value2 * $value3);

    print "$texte $tot_val2\n";
    print FICHIERNOUVELLES "$texte ($tot_val2)\n";
}
close FICHIERNOUVELLES;
close $FIC1;

у меня есть 2 ошибки в моем скрипте:

«Использование неинициализированного значения $texte в конкатенации (.) или строки в perl.pl, строка 18, строка 1.

Использование неинициализированного значения $value2 в умножении (*) в строке 14 perl.pl, строке 2.

Любая идея, пожалуйста? огромное спасибо


person Poisson    schedule 05.05.2013    source источник
comment
C'est clair comme le cul de d'Oussama à 200 pieds de funds dans la mer noire.   -  person Gilles Quenot    schedule 05.05.2013
comment
Где-то есть вопросы? Или мы должны догадаться, что происходит, что вы ожидаете?   -  person Gilles Quenot    schedule 05.05.2013
comment
у меня есть 2 ошибки в моем скрипте Использование неинициализированного значения $texte в конкатенации (.) или строка в строке 18 perl.pl, ‹$FIC1› строка 1. Использование неинициализированного значения $value2 в умножении (*) в строке perl.pl 14, ‹$FIC1› строка 2.   -  person Poisson    schedule 05.05.2013
comment
Поместите это в свой исходный пост   -  person Gilles Quenot    schedule 05.05.2013


Ответы (2)


Проблема :

вы пытаетесь получить захваты 4 раза:

($1, $2, $3, $4)

но у вас есть только 2 группы захвата в вашем регулярном выражении.

Группа захвата — это то, что вы помещаете внутрь () в своем регулярном выражении.

Хорошим началом является чтение perldoc perlretut.

person Gilles Quenot    schedule 05.05.2013
comment
Так что я должен изменить эту часть $line1 =~ /^([a-zA-ZÀÁÂÃÄÅÇÈÉÊËÌÍÎÏñœ=ÒÓÔÕÑÖæñßÙÚÛÜÝàáâãäåçèéêëìíîïðòóô-õöùúûüý@#-%&*_\s]+)([.\d]+)$/;? - person Poisson; 05.05.2013
comment
Если вы считаете, что ответ полезен, вы можете «проголосовать» за него. Если вы считаете, что на ответ дан хороший ответ, вы можете «принять» его, щелкнув контур checkmark (будет зеленым), таким образом, люди, ищущие веб-сайт stackexchange, узнают, что на вопрос дан хороший ответ. Вот как работают сайты stackechange, спасибо;) - person Gilles Quenot; 05.05.2013
comment
Для голосования требуется 15 репутаций ;) - person Poisson; 05.05.2013
comment
@CyrineEzzahra Возможно, вам следует изучить использование предопределенных классов персонажей вместо того, чтобы пытаться создавать свои собственные. Это выглядит ужасно в обслуживании. ZÀÁÂÃÄÅÇÈÉÊËÌÍÎÏñœ=ÒÓÔÕÑÖæñßÙÚÛÜÝàáâãäåçèéêëìíîïðòóô-õöùúûüý@#-%&*_\s - person TLP; 05.05.2013

Ваш код не соответствует вашему вопросу, поэтому я изо всех сил пытаюсь понять, что вам здесь нужно. Например, вы просите

Hello |||good ||| 0.1/0.2 0.2/0.3 2.718

в вашем выводе, но ваш код перемножает значения. И я не могу сказать, откуда берется 2.718 (это просто значение e?)

Однако вы должны использовать split для разделения данных на столбцы. Этот код показывает идею.

Значение $tot_val2 не отображается, потому что так было в вашем собственном коде. Кроме того, я не был уверен, хотите ли вы первое или второе текстовое поле. Я показал первый. Второй находится в $colonnes[0], если он вам нужен.

use strict;
use warnings;
use autodie;
use 5.010;

my ($fichier1) = 'fichier1.txt';

open my $fic1, '<', $fichier1;
open my $fn,   '>', 'resultat.txt';

while (<$fic1>) {
    my ($texte, $reste) = split /\s*->\s*/;
    my @colonnes = split ' ', $reste;
    my ($value1, $value2, $value3) = @colonnes[1..3];

    my $tot_val1 =sprintf('%.15f', $value1 * $value2);
    my $tot_val2 =sprintf('%.15f', $value2 * $value3);

    print "$texte $tot_val2\n";
    print $fn "$texte ($tot_val2)\n";
}

close $fn;

вывод

Hello 0.060000000000000
Hello 1.200000000000000
person Borodin    schedule 05.05.2013