【问题标题】:Perl search for string and get the full line from text filePerl 搜索字符串并从文本文件中获取整行
【发布时间】:2014-08-19 19:03:18
【问题描述】:

我想搜索一个字符串并通过 Perl 脚本从文本文件中获取整行。

所以文本文件将如下所示。

data-key-1,col-1.1,col-1.2
data-key-2,col-2.1,col-2.2
data-key-3,col-3.1,col-3.2

在这里,我想应用data-key-1 作为搜索字符串,并将整行放入 Perl 变量中。

这里我想在 shell 中完全替换 grep "data-key-1" data.csv

以下语法在控制台中运行时有效。

perl -wln -e 'print if /\bAPPLE\b/' your_file

但是我怎样才能将它放在脚本中呢?使用perl 关键字,我们无法将其放入脚本中。有没有办法避免循环?

【问题讨论】:

    标签: perl


    【解决方案1】:

    如果您知道为单行提供的命令行选项,您就会确切地知道在perl 脚本中要写什么。当你读取一个文件时,你需要一个循环。循环的选择可以在性能方面产生不同的结果。使用for 循环读取一段时间比使用while 循环读取文件更昂贵。

    你的单行:

    perl -wln -e 'print if /\bAPPLE\b/' your_file
    

    基本上是在说:

    • -w:使用警告
    • -l :在处理之前从每行中剔除换行符,并在打印期间将其放回原处。
    • -n :创建一个隐式 while(<>) { ... } 循环以对每一行执行一个操作
    • -e :告诉 perl 解释器执行它后面的代码。
    • print if /\bAPPLE\b/ 如果行包含单词APPLE,则打印整行。

    所以要在perl 脚本中使用上述内容,您可以:

    #!usr/bin/perl
    
    use strict;
    use warnings;
    
    open my $fh, '<', 'your_file' or die "Cannot open file: $!\n";
    
    while(<$fh>) {
        my $line = $_ if /\bAPPLE\b/;
        # do something with $line
    }
    

    chomp 在这里并不是真正需要的,因为除了检查单词是否存在之外,您没有对该行进行任何操作。

    【讨论】:

    • 谢谢杰帕尔。这个解释很清楚。而且我没有意识到-n 正在循环。你能帮我把这个值分配给一个变量而不是打印吗?
    • 只是我想用搜索关键字提取行以转到像$line 这样的变量。例如,如果我在该文件中搜索字符串 data-key-2data-key-2,col-2.1,col-2.2 行应该作为字符串转到 perl 变量 $line。然后我可以为我的程序处理该字符串。
    【解决方案2】:
    open($file, "<filename");
    while(<$file>) {
       print $_ if ($_ =~ /^data-key-3,/);
    
    }
    

    【讨论】:

    • 感谢您的回复。这我已经在使用了。但是,如果您可以在没有循环的情况下提出建议,那就太好了。因为循环非常消耗资源。
    • 没有循环是不可能的。即使您将其编码为 perl 单行代码,它仍然是一个循环...
    • 但语法如下在控制台中工作perl -wln -e 'print if /\bAPPLE\b/' your_file。有什么办法可以将其转换为放在脚本中?
    • 如果知道key只出现一次,找到后退出循环。
    • perl -wln -e 'print if /\bAPPLE\b/' your_file 也在内部执行循环。这段代码没有区别。
    【解决方案3】:
    use strict;
    use warnings;
    
    # the file name of your .csv file
    my $file = 'data.csv';
    
    
    # open the file for reading
    open(FILE, "<$file") or
     die("Could not open log file. $!\n");
    
     #process line by line:
    while(<FILE>) {
    
     my($line) = $_;
    
     # remove any trail space (the newline)
     # not necessary, but again, good habit
     chomp($line);
    
    
    my @result = grep (/data-key-1/, $line);
    push (@final, @result); 
    }
    print @final; 
    

    【讨论】:

    • 这可行,但是否可以通过其他方式在不循环的情况下获取变量$line
    • 奇怪的选择使用grep 而不是简单的if。此外,@result 将仅保存包含字符串的 last 行。
    • @Borodin 这是一个选项,但我同意如果如上所示更好。 :) 我加了推 :)
    • @Borodin:如果我在 perl 脚本perl -wln -e 'print if /\bAPPLE\b/' your_file 中使用,您能否告诉我如何转换此命令,因为您建议此语法具有 if 并且它是单行解决方案。我需要这个语法进入 perl 脚本和分配给变量的值。
    猜你喜欢
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 2019-10-24
    相关资源
    最近更新 更多