【问题标题】:Perl - awk syntax error @arrayPerl - awk 语法错误@array
【发布时间】:2014-05-14 01:08:46
【问题描述】:

我需要一些帮助来让 awk 在 perl 中工作,或者找到更好的替代方案...

此代码在 | 返回有关语法的错误使用 awk 命令解析细节时。

my @LIST = `/bin/sh $DIR/ami-show.sh Version: | awk '{print $3}'`;

确切的错误是

Use of uninitialized value $3 in concatenation (.) or string at test line 20, <STDIN> line 1.

非常感谢任何帮助

编辑:已解决!!

将 \ 添加到 '{print \$3}' 后,此命令的所有功能都可以正常工作。

【问题讨论】:

  • 在 perl 中使用 awk 简直是愚蠢的,因为 perl 可以做 awk 可以做的所有事情,而且你会浪费一个进程。
  • 感谢提醒大声笑...“愚蠢”是一种苛刻的表达方式,对吧!?我是 perl 的新手,并且使用的方法可能不是“最佳实践”,这就是为什么我要求可能的更好的替代方案!无论如何,我发现了问题......在打印中添加 \$3 而不是 $3 是诀窍
  • @NickHatfield 我不使用 perl,所以我不能告诉你正确的方法是什么,但那不可能。这就像努力在微波炉中生起篝火,并弄清楚你需要让门保持打开状态,这样它就不会耗尽空气。是的,这会“解决你的问题”,但是....
  • 好吧,至少应该祝贺您使用strictwarnings
  • 我的意图不是听起来很刺耳 :-) 参见例如#6 关于如何在awk-modeblogs.oracle.com/ksplice/entry/the_top_10_tricks_of中使用perl

标签: perl syntax awk


【解决方案1】:

正如您已经确定的那样,问题在于变量$3 的插值。不用转义 $ 来解决问题,这可以通过使用 perl 拆分命令的输出来完全规避。

您应该能够在 perl 中使用split 而不是依赖awk 来执行类似的操作。请注意,awk 命令中使用的$3 对应于索引号 2,因为数组从索引 0 开始。

my $output = `/bin/sh $DIR/ami-show.sh Version:`;
my $column = (split ' ', $output)[2];

split 将正则表达式作为其第一个参数(模式)并拆分第二个参数中包含的字符串。上面的代码在任意数量的空白处分割命令的输出,这与awk 默认情况下所做的相同。

编辑:如果您看到我的第一次编辑,我只是​​做了split $output,省略了模式参数。这实际上是有效的,因为不指定模式会调用相同的类似 awk 的行为。

【讨论】:

    【解决方案2】:

    您想阻止 Perl 插入 $3 变量。您可以尝试将您的 awk 命令分隔成自己的字符串,以便更好地进行插值控制:

    my $awk = q(awk '{print $3}');
    my @LIST = `/bin/sh $DIR/ami-show.sh Version: | $awk`;
    

    【讨论】:

    • 不错...这是书本上的,如果我遇到另一种 awk 情况,我可以试试这个...
    猜你喜欢
    • 2021-09-07
    • 2020-07-09
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 2014-08-30
    • 2017-01-12
    相关资源
    最近更新 更多