2013-05-05 64 views
2

我在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 线 perl.pl线18,第1行

在乘法(*)使用未初始化值$ VALUE2 14 ,第2行。

有什么想法吗? 非常感谢

+0

花莲克莱尔COMME乐穹窿D'Oussama 200个pieds德全宗丹斯海蓝之谜黑角。 – 2013-05-05 17:53:34

+0

某处有什么问题吗?或者我们必须猜测发生了什么问题,你期望什么? – 2013-05-05 17:56:44

+0

我在我的脚本中有2个错误“使用未初始化的值$ texte连接(。)或字符串在perl.pl行18,<$FIC1>行1。 使用未初始化的值$ value2乘以(*)在perl.pl第14行,<$FIC1>第2行。 – Poisson 2013-05-05 17:58:52

回答

1

问题:

您尝试检索捕获4倍:

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

,但你只有2捕获组在您的正则表达式。

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

良好的开端是读perldoc perlretut

+0

所以我必须改变这部分'$ line1 =〜/ ^([a-zA -ZAÁÂÇÈÉÊËÌÍÎÏñœ=ÒÓÔÕÑÖæñßÙÚÛÜÝàáâã'éçèéêëìíîïðòóô-õöùúûüý@# - %&* _ \ s] +)([。\ d] +)$ /;'? – Poisson 2013-05-05 18:06:08

+0

是的,你需要更多'()',看看我编辑过的帖子 – 2013-05-05 18:07:58

+0

谢谢任何​​方式 – Poisson 2013-05-05 18:24:16

1

你的代码不符合您的问题,所以我努力理解什么您这里需要。举例来说,你问

Hello |||good ||| 0.1/0.2 0.2/0.3 2.718 
在输出

,但你的代码值。我说不出哪里2.718来自(它只是é?值)

但是,你应该使用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