将两个 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 >=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 >=7'
这可能会打印一些行两次。
我猜这些行将是匹配 /^\@/ 的一次,并且还会检查 if /NM:i:(\d+)/ and $1 >=7
条件【参考方案2】:
我倾向于将这些问题视为要跳过的行而不是要输出的行。但是,条件的组合和ikegami has already shown一样:
perl -pe 'next unless(/NM:i:(\d+)/ && $1 >= 7)' ...
【讨论】:
以上是关于将两个 if 语句合并为一个的 Perl 单行器的主要内容,如果未能解决你的问题,请参考以下文章
Perl if 语句,If value = nothing do 语句 if value = something do 语句