我正在尝试将文件读入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参数。它似乎无法将表达式与文件格式匹配。
任何帮助表示赞赏!
感谢。
答案 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 +。]”。