在perl中读取文件并分配变量

时间:2014-11-12 20:05:11

标签: perl file variables

我正在尝试将文件读入perl并为文件中的每个字符分配变量。我做了很多次并且工作得很好。但对于这个文件,我不太清楚我做错了什么。

所以文件看起来像这样:

     1   1    4 4 4    0.1000E+01  0.1000E+01  0.1966E+02     1   66    2    2      9  81
     2   2    4 4 4    0.1000E+01  0.1000E+01  0.2832E+02     1    9    3    3      9  13
     3   1    4 4 4    0.1000E+01  0.1000E+01  0.2538E+02     1   75    2    2     13  82
     4   2    4 4 4    0.1000E+01  0.1000E+01  0.1507E+02   127    1    3    3     81  82
     5   1    4 4 4    0.1000E+01  0.1000E+01  0.2663E+02     9   80    2    2      9  17
     6   1    4 4 4    0.1000E+01  0.1000E+01  0.3031E+02     9   87    2    2     13  21
     7   2    4 4 4    0.1000E+01  0.1000E+01  0.3065E+02     9   17    3    3     17  21
     8   1    4 4 4    0.1000E+01  0.1000E+01  0.3574E+02    49   10    2    2     18  50
     9   2    4 4 4    0.1000E+01  0.1000E+01  0.3396E+02    10   94    3    3     18  58
    10   2    4 4 4    0.1000E+01  0.1000E+01  0.2903E+02    66   10    3    3     50  51
    11   1    4 4 4    0.1000E+01  0.1000E+01  0.1711E+02    80   10    2    2     51  57
    12   2    4 4 4    0.1000E+01  0.1000E+01  0.2776E+02    10   18    3    3     57  58
    13   1    4 4 4    0.1000E+01  0.1000E+01  0.3448E+02    16   49    2    2     22  49

这就是我一直想做的事情:

#!/usr/bin/perl

use strict;

open OPLINE, "<$lfile" or die "\033[31mError: Can't open $lfile\033[0m ";
my $line = <OPLINE>;
while ($line) {
     #my @fields = split(" ",$line);
        if ($line =~ /\s*(\d+)\s*(\d)\s*(\d)\s(\d)\s(\d)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d)\s*(\d)\s*(\d+)\s*(\d+)/){
        my ($Line, $Xi, $Basis1, $Basis2, $Basis3, $Deriv1, $Deriv2, $Length, $Node1, $Node2, $der1, $der2, $Element1, $Element2) = ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14);
        }

}
$line = <IPNODE>;      

脚本一直运行到IF参数。它似乎无法将表达式与文件格式匹配。

任何帮助表示赞赏!

感谢。

2 个答案:

答案 0 :(得分:1)

您是否尝试过这样的事情:

my ($discard, $Line, $Xi, $Basis1, $Basis2, $Basis3, $Deriv1, 
           $Deriv2, $Length, $Node1, $Node2, $der1, $der2, 
                                   $Element1, $Element2) = split(/\s+/, $line);

我已添加了前导$discard变量,因为split()会将前导空格视为第一项和第二项之间的分隔符。

答案 1 :(得分:0)

“\ d”是匹配的数字。你有小数点的标点符号,“E”和“+”:“[0-9E +。]”。