2

我对 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 个错误:

"在 perl.pl 第 18 行第 1 行的连接 (.) 或字符串中使用未初始化的值 $texte。

在 perl.pl 第 14 行第 2 行的乘法 (*) 中使用未初始化的值 $value2。

请问有什么想法吗?非常感谢

4

2 回答 2

1

问题 :

您尝试检索捕获 4 次:

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

但是您的正则表达式中只有 2 个捕获组。

捕获组是您在正则表达式中放入的内容()

一个好的开始是阅读perldoc perlretut

于 2013-05-05T18:02:02.570 回答
1

您的代码与您的问题不符,所以我很难理解您在这里需要什么。例如,您要求

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
于 2013-05-05T19:14:10.907 回答