【问题标题】:PERL: line by line text parsing scriptPERL:逐行文本解析脚本
【发布时间】:2013-11-28 21:19:31
【问题描述】:

出于练习和好奇心,任何人都知道是否可以使以下脚本更紧凑和更快:

foreach(@list){
    if ($_=~"givenName: ") {
        $cname=$_;
        $cname=~ s/givenName: //g;
    } 
    if ($_=~"cn: ") {
        $cn=$_;
        $cn=~ s/cn: //g;
    }
    ...
}

什么是: - 它在行内寻找一个字符串,看看它是否包含那个特定的索引 - 然后它剥离字符串并读取将内容放入变量的行的其余部分。 - 该脚本逐行读取另一个脚本的结果并识别每一行的字段,将值放入适当的变量中

【问题讨论】:

    标签: regex perl parsing


    【解决方案1】:

    如果列表中的每一行都保证采用 'variableName: someText' 格式,那么您可以这样做:

    foreach (@list) {
        /^(\w+): (.*)/ && $vars{$1} = $2;
    }
    

    它与您的解决方案不完全一样——它将结果放入 %vars 散列而不是放入名为 $cname$cn 等的变量中——但它更简洁和通用。

    【讨论】:

    • 谢谢你。但关键是这些线条应该按任何顺序排列。所以脚本需要读行才能理解 var 读的是什么。
    • 无论首先出现哪些行和变量,此代码都将起作用。如果“givenName”行首先出现,那么$vars{givenName} 将是第一个变量集。如果“tel”首先出现,那么$vars{tel} 将是第一个变量集。
    【解决方案2】:

    这样的事情怎么样?

    my $data = {}; #a hashref to store your data
    foreach my $line(@list){
        $line =~ s/(givenName|cn|more|names):\s//g and $data->{$1} = $line;
        ...
    }
    #EDIT: now you have all your data inside the hashref and can call each var accordingly
    print $data->{givenName};
    print $data->{cn};
    

    【讨论】:

    • @qwrrty:谢谢,但我需要能够识别行内的数据,然后用行的左侧填充变量:即:名称:John,地址:cavendish str ,电话:0207 123 4556。并非所有字段都存在,而且顺序也不相同。
    • @user3008283 查看我的编辑。从哈希中获取任何变量都很容易。
    • @user3008283 你的意思是单行可能包含几个不同的变量需要分别解析?
    • 不,每一行将只有一种数据类型,由该行中的第一个单词标识: name: john lastname: smith etc 但顺序会改变,所以脚本需要读取第一个行的一部分,以了解将遵循什么值。
    • foibs,看起来您的解决方案正是我所需要的。我喜欢你的代码和你使用哈希的方式。我的代码采用了类似的方式,但我很想找到一种更优雅的方式来实现它,而你的方式就是这样做的。干得好
    【解决方案3】:
    my @list = ('name', 'givenName: ', 'noname');
    foreach(@list){
        s/givenName: //g if /givenName: /; 
        my $var = $_;
        ...
    }
    

    【讨论】:

    • 谢谢FlyingFrog,但我也可以在同一行中填充变量吗?即: $givenname=...if , $name=...if, $cn=...if
    • @user3008283 - 查看更新 - 为什么要将它放在同一行?
    • 同意更新,我只是好奇它是否可以在 1 行中完成...这是练习的一部分 :-)。顺便说一句,在同一行中完成也将是 if 的一部分。这样变量只有在字符串匹配时才会更新。
    猜你喜欢
    • 2012-10-26
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    相关资源
    最近更新 更多