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我将以一个问题的形式回答你的问题:为什么不更进一步,迭代文件中的所有字母?@mak
file::Slurp
是你可以从CPAN获得的标准包,也就是说,
CPAN file::Slurp
应该可以做到这一点
mak knl 23