将两个 if 语句合并为一个的 Perl 单行器

Posted

技术标签:

【中文标题】将两个 if 语句合并为一个的 Perl 单行器【英文标题】:Perl one-liner that combines two if statements into one 【发布时间】:2022-01-13 18:53:52 【问题描述】:

我已经编写了一个脚本格式的 perl 代码。这是脚本:

#!/usr/bin/perl
use strict;
use warnings;

    while(<>)
        chomp;
        my @s = split /\t/,$_;
        if($_ =~ /NM:i:(\d+) and $1 >= 7/)
            print $_,"\n";
        
    

我想以 perl 单行方式编写这个 perl script.pl 代码。 Itried 类似这样的事情,但它没有做我期望它做的事情:

perl -ne '@s = split; if $_ =~ /NM:i:(\d+)/ print if $1 >=7'

如何解决这个问题? 谢谢

【问题讨论】:

@s 的目的是什么?它不用于任何事情 试试这个perl -ne 'print if /NM:i:(\d+)/ and $1 &gt;=7' file.txt 是的,我同意,我只是用它来将行分成列,但你是对的,这里不用它。 您的解决方案有效,但这是否意味着在我的 script.pl 中,我可以避免 2 个 if 语句? 您还必须在脚本中使用一个 if 语句 【参考方案1】:
perl -ne'print if /NM:i:(\d+)/ && $1 >= 7'

您在其中的选项卡上有不必要的拆分。但是,假设您确实需要它。如果是这样,你可以使用

perl -F'\t' -lane'print if $F[0] =~ /NM:i:(\d+)/ && $1 >= 7'

这仅匹配第一个字段。


这是否意味着在我的 script.pl 中,我可以避免 2 个 if 语句?

是的。

除了范围不同之外,以下是等价的:

if (f()) 
   if (g()) 
      h();
   


if (f() && g()) 
   h();


h() if f() && g();

f() && g()
   and h();

【讨论】:

谢谢,我还想打印以 @ 开头的行,一旦打印出来,就转到下一行并执行上面的一行。如何打印以@ 开头的行 您可以使用/^\@/检查$_中的字符串是否以@开头。 perl -ne 'print if /^\@/ ; print if /NM:i:(\d+)/ and $1 &gt;=7' 这可能会打印一些行两次。 我猜这些行将是匹配 /^\@/ 的一次,并且还会检查 if /NM:i:(\d+)/ and $1 &gt;=7 条件【参考方案2】:

我倾向于将这些问题视为要跳过的行而不是要输出的行。但是,条件的组合和ikegami has already shown一样:

perl -pe 'next unless(/NM:i:(\d+)/ && $1 >= 7)' ...

【讨论】:

以上是关于将两个 if 语句合并为一个的 Perl 单行器的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的单行 if 语句

合并 2 选择语句为 1

可以clang格式将大括号添加到单行if语句等

在 vim 编辑中使用 perl 单行命令

Perl单行(Perl One-Liners)命令

Perl if 语句,If value = nothing do 语句 if value = something do 语句