Perl中的分区脚本

时间:2013-05-05 17:49:36

标签: perl division

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

  

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

     

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

请问好吗? 非常感谢

2 个答案:

答案 0 :(得分:1)

问题:

您尝试检索4次捕获:

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

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

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

良好的开端是阅读perldoc perlretut

答案 1 :(得分: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