如何在awk中跳过perl中的其余部分?

j1dl9f46  于 12个月前  发布在  Perl
关注(0)|答案(3)|浏览(143)

awk中的next命令将:
停止处理当前的输入记录。读取下一个输入记录,并开始处理AWK程序中的第一个模式。当到达输入数据的末尾时,执行任何END规则。
假设我的perl脚本是一个转换规则的列表,在perl中有没有这样的东西可以模拟它,就像我写代码一样:

s/a/A/g;
s/b/B/g; next();
s/c/C/g;

next?()将检查给定的替换是否成功,然后停止处理其余的转换规则,并改为从转换规则的第一模式重新开始。
最好的方法是什么?
输入示例:

R: waltz
M: 3/4
L: 1/4
K: C
|: E2"C"G | d3"G7" | c2"C"G | F3"F" | E2"C"E | EFG | A3"Dm" | G3"G7" |
| E2"C"G | d3"G7" | c2"C"G | F3"F" | E2"C"G | G"G7"AB | c3"C"- | c3 ||
||d"G7" z/G/ G | BAG | E2"C"G | c3 | A2"F"c | d2"D"c | B3"G" | G3 |
| E2"C"G | d3"G7" | c2"C"G | F3"F" | E2"C"G | G"G7"AB c3"C" | c3 :|

ABC音符,如E2Gd3是最后处理/替换的(在while /re/gi循环中),而吉他和弦"C" "Dm" "G7"等,首先被替换,然后跳过ABC音符替换。我试图使用next if s/".*?"/^$&/g;来替换吉他和弦部分,但是,我所有的ABC音符替换都被跳过,后来的while循环无法到达。

rvpgvaaj

rvpgvaaj1#

作为一个一行程序,我会做什么:

perl -lnE 's/a/A/g; next if s/b/B/g; s/c/C/g; say' file
nhaq1z21

nhaq1z212#

这将跳过偶数并打印奇数。

#!/usr/bin/perl
use v5.30;
use warnings;

my @numbers = 1..20;

for my $number (@numbers){
    next if $number % 2 == 0;
    say $number;
}
ncecgwcz

ncecgwcz3#

我不是perl-忍者,但如果你有工作解决方案在某些语言,并希望转换到另一个,你可能会发现转译器。我设法揭开存在的a2p,我设法通过做sudo cpanm -S App::a2p,然后我创建了program.awk基于您的例子,即

{gsub(/a/,"A")}
gsub(/b/,"B"){next}
{gsub(/c/,"C")}
{print}

作为gsub function
返回所做的替换数
这将是一样的问 * 是否有任何替换 * 当使用作为模式.注意,它不会 * 打印行与b作为GNU AWK被指示next行,在它是print ed.然后我召唤a2p如下方式

a2p program.awk > program.pl

program.pl的含量为

#!/usr/bin/perl
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
    if $running_under_some_shell;
            # this emulates #! processing on NIH machines.
            # (remove #! line above if indigestible)

eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;
            # process any FOO=bar switches

$, = ' ';       # set output field separator
$\ = "\n";      # set output record separator

line: while (<>) {
    chomp;  # strip record separator
    s/a/A/g;
    if (s/b/B/g) {
    next line;
    }
    s/c/C/g;
    print $_;
}

我使用file.txt测试了它,内容如下

aaa
aab
aac
aba
abb
abc
aca
acb
acc
baa
bab
bac
bba
bbb
bbc
bca
bcb
bcc
caa
cab
cac
cba
cbb
cbc
cca
ccb
ccc

通过做

perl program.pl file.txt

并得到期望输出,即,

AAA
AAC
ACA
ACC
CAA
CAC
CCA
CCC
  • (使用perl 5,version 34,subversion 0测试)*

相关问题