Perl 如何将特定模式与if条件相匹配
我的文本文件:Perl 如何将特定模式与if条件相匹配,perl,pattern-matching,Perl,Pattern Matching,我的文本文件: Name: mak Place: ynr Age: 22 ------------- Name: john Place: kkr Age: 21 ------------- Name: mak Place: knl Age: 23 ------------- 我正在做的是: open(FILE, "path to file") or die ""; $check="mak"; @arr=<FILE> for(@arr) { if ($_=/Name:\s
Name: mak
Place: ynr
Age: 22
-------------
Name: john
Place: kkr
Age: 21
-------------
Name: mak
Place: knl
Age: 23
-------------
我正在做的是:
open(FILE, "path to file") or die "";
$check="mak";
@arr=<FILE>
for(@arr)
{
if ($_=/Name:\s(.*)/)
{
$a=$1;
if($a eq $check)
{
print "matched name"
}
#now i want if "mak" is matched then after that it should match the age and store it one variable and then compare it with other matched age with same name
}
}
open(文件,“文件路径”)或die“”;
$check=“mak”;
@啊=
对于(@arr)
{
如果($)=/Name:\s(.*)/)
{
$a=$1;
如果($a eq$支票)
{
打印“匹配名称”
}
#现在我想知道,如果“mak”匹配,那么在匹配之后,它应该匹配年龄并将其存储为一个变量,然后将其与具有相同名称的其他匹配年龄进行比较
}
}
我想先得到名字,如果它匹配为“mak”,那么我需要检查年龄并比较年龄。有很多方法可以做到这一点,但我喜欢它的简洁性:
use File::Slurp;
@records=split('---',read_file('file.txt'))
例如,现在,$records[0]
包含:
Name: mak
Place: ynr
Age: 22
@records
中会有“垃圾”条目,因为分割模式并不完美,但这并不重要。现在,您可以遍历@记录
以找到所需的记录。您的文件格式可以描述如下:
- 多个记录通过一个水平条相互分隔
- 每个记录都有多个名称-值对,每一对都在自己的行上
$/
可以设置为任意字符串,因此我们可以这样做
local $/ = "-------------\n";
现在,每个readline操作将返回一条记录chomp
将移除分离器
从记录中获取字段非常简单
my %fields = map split(/:\s*/, $_, 2), split /\n/, $record;
我们可以将其结合起来,一次检查一个记录:
use strict; use warnings;
my $check = shift @ARGV;
local $/ = "-------------\n";
while (<>) {
chomp;
my %fields = map split(/:\s*/, $_, 2), split /\n/, $_;
if ($fields{Name} eq $check) {
# do something
}
}
使用严格;使用警告;
我的$check=shift@ARGV;
本地$/=“--------------\n”;
而(){
咀嚼;
我的%fields=映射拆分(/:\s*/,$\u2),拆分/\n/,$\u2;
如果($fields{Name}eq$check){
#做点什么
}
}
这将在命令行上调用,如perl-script.pl mak file.txt
以下是另一个选项:
use strict;
use warnings;
my @rec;
while (<>) {
push @rec, $1 if /^(?:Name|Place|Age):\s+(.+)/;
next unless @rec == 3;
print "@rec\n" if $rec[0] eq 'mak' and $rec[2] == 23;
undef @rec;
}
在读取文件行时,正则表达式查找以名称、年龄或位置开头的行,然后捕获冒号后面的所有空白。$1
中捕获的值被推送到@rec
上,下一行被读取,除非这三行记录已被处理。如果@rec
的元素0等于“mak”,元素2等于23,则打印记录的值。最后,@rec
被定义为undef
,因此它可以准备好进行下一个记录
希望这有帮助 那么,到目前为止你试过什么?互联网上到处都有数百个perl“匹配东西”的例子。到目前为止你的代码是什么?你到底被困在哪里?请回答你的问题以添加代码/完善你的问题。不要在注释中发布。源文件与类似。有一种方法可以为您进行解析。(但是,在YAML中,水平条必须是三个负号--
长)在代码中使用=而不是=~您可以使用如果(/Name:\s(.*)/)
匹配$\uuu
嗨,我遇到了以下错误:在中找不到文件/Slurp.pm@INC@Mak_Thareja您可以用do{打开我的$fh,“与其迭代@记录
“以找到您需要的记录,”为什么不直接迭代原始行本身(这些记录中不会有任何“垃圾”条目)?@kenosis我将以一个问题的形式回答你的问题:为什么不更进一步,迭代文件中的所有字母?@makfile::Slurp
是你可以从CPAN获得的标准包,也就是说,CPAN file::Slurp
应该可以做到这一点
mak knl 23