【问题标题】:Perl Split doesn't split into ArrayPerl Split 不会拆分为 Array
【发布时间】:2014-06-18 10:16:24
【问题描述】:

我有一个文件,我必须逐块读取(基于时间戳)。所以我使用 awk 在两个时间间隔之间读取,然后我必须进一步处理数据。为此,我必须逐行阅读从 awk 收到的字符串。当我使用新字符执行拆分时,它不会拆分,但所有字符串都保留在第一个字段中。我使用了不同的转义字符,但没有任何成功。

我的主要目的是逐行读取字符串。

    $cmd = "awk '\$0>=from&&\$0<=to' from=\"$currentTime\" to=\"$nextTime\" Output.txt";
    $dataChunk = system ($cmd);
    my @lines = split /[\r\s\v\V\n]+/, $dataChunk;
    foreach my $line (@lines) {
        chomp;
        $timeStamp1 = (split /-/, $line)[1];
        print "\n$timeStamp1\n";
        exit;
    }

【问题讨论】:

  • 只是为了确定,如果您打印该行,它会打印多行吗?还是单行?
  • 当我执行 'more Output.txt' 时,它会打印多行
  • 您确定要使用system吗?你不应该使用qx($cmd)吗?
  • Perl 部分是作为awk-killer 编写的(不是100% 成功,因为awk 仍然存在)。然而,如果你从 Perl 运行 awk 然后处理它的输出,你就“做错了”——Perl 可以自己管理 awk 所做的事情。
  • 您还可以通过使用自定义单引号来避免命令分配中的所有反斜杠:$cmd = q[awk '$0&gt;=from&amp;&amp;$0&lt;=to' from="$currentTime" to="$nextTime" Output.txt]; — 其中q[…] 是一种可能的自定义引号(括号对),或者您可以使用非-括号字符,如q%…%,用于任何未出现在正文中的方便字符。您也可以使用自定义双引号:qq[…]qq%…% 等。

标签: string perl split


【解决方案1】:

应该是,

my $dataChunk = qx($cmd);
my @lines = split /[\r\s\v\V\n]+/, $dataChunk;

因为system()返回值是程序的退出状态。

【讨论】:

  • @AntonH 他们是等价的。
【解决方案2】:

问题是system 并没有按照你的想法去做。 system 将返回退出代码,而不是命令的标准输出。

对于命令的标准输出,您想使用qx($cmd)(或在命令周围使用反引号)。

【讨论】:

    【解决方案3】:

    当您只想在两个时间戳之间读取时,使用 awk 很愚蠢:

    use strict;
    use warnings;
    use autodie;
    use feature qw(say);
    
    use constant  TIMESTAMP_FILE => 'Output.txt';
    
    my $current_time = ...;
    my $next_time = ...;
    open my $tstamp_fh, "<", TIMESTAMP_FILE;
    while ( my $line = <$tstamp_fh> ) {
        chomp $line;   # Always chomp on a read!
        next if $line lt $current_time or $line gt $next_time;
        say (split /-/, $line)[1];   # Is this the first or second element of the array?
    }
    

    类似的东西。有点难以分辨,因为我不知道你的文件是什么样子的。

    最主要的是,当您使用 Perl 时,绝对不需要运行 awk。无论 awk 能做什么,Perl 也能。

    如果您不能 100% 确定如何做某事,您始终可以使用 Perl 附带的 a2p 程序将任何 Awk 程序转换为 Perl 代码。

    【讨论】:

      猜你喜欢
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2021-02-18
      相关资源
      最近更新 更多