我有一个输入文件,不能格式错误,我只想检查并看到文件格式正确,然后再继续计算程序。对于这个输入文件,逐行读取它将起作用,因为我只需要检查每一行的开头。
INPUT.TXT:
Data1: 30
Data2: 20
Data3: 50
基本上,我想逐行阅读,并检查每一行是否以" Data1开始:"或"数据2:"或者"数据3:",没有别的。换句话说,我可以假设那些之后的内容将是一个整数(在本应用程序的上下文中,没有办法不存在)。但是,如果该行的开头并没有从其中一个开始,那么我需要立即停止以避免混淆任何东西。
我认为我需要使用索引函数,并检查此子字符串的索引是否位于位置0(即在行的最开头)。或者,也许我需要使用正则表达式。
尝试编号1:
if (index($str, $substr) == 0) {
print "$str contains $substr\n";
}
尝试1号错了。这让事情变得复杂了。我应该在这里使用正则表达式。
尝试编号2:
open my $in, '<', 'in.txt';
$iteration = 0
while(<$in>){
chomp;
next if /\s*(?:#|$)/; //Skip over lines starting with # or empty lines.
if($iteration==0) {
die "Error in file formatting!\n" unless /^Data1: [a-Z]+/;
my ($data1) = /Data[1]: ([a-z0-9-]+)\s*/;
$iteration++;
}
else if($iteration==1) {
die "Error in file formatting!\n" unless /^Data2: \d+/;
my ($data2) = /Data[2]: (\d+)/;
$iteration++;
}
else if($iteration==2) {
die "Error in file formatting!\n" unless /^Data3: \d+/;
my ($data3) = /Data[3]: (\d+)/;
$iteration=0;
}
}
答案 0 :(得分:1)
假设当前行在$_
:
/^Data[123]: \d+/ or die;
将检查字符串以Data
开头,1到3之间的数字,冒号,空格和正整数。
如果您的行位于$str
,并且您需要错误消息,则语法为:
$str =~ /^Data[123]: \d+/ or die "Invalid line: $str";
如果需要提取值,请将模式更改为:
/^Data([123]): (\d+)/
匹配后,值将位于$1
和$2
变量中。
跳过评论行会很简单:
next if /^\s*(?:#|$)/;
这将检查该行的第一个非空白字符是#
还是该行为空。
答案 1 :(得分:1)
使用索引是实现我认为你之后的一种混乱方式。这将读入您的文件,并逐行处理,如果一行不以数据1&#39;,&#39;数据2&#39;开头,则退出循环。或者&#39; Data3&#39; (印刷品只是说明了这一点):
use strict;
use warnings;
open my $in, '<', 'in.txt';
while(<$in>){
chomp;
next if /^#/; # Will skip the line if it begins with #
my ($number) = /Data[123]: (\d+)/; # Assigns the integer that follows Data1/2/3 to the scalar `$number`
die unless /^Data[123]/; # Exit loop if line doesn't begin with Data1/2/3
print "$number\n";
}