perl - 如何在 perl 中使用数组索引删除单词?

标签 perl

如何使用 Perl 为以下输入删除使用数组索引的某些单词?

file.txt
BOCK:top:blk1
BOCK:block2:blk2
BOCK:test:blk3

加入后:

/BOCK/top/blk1
/BOCK/block2/blk2
/BOCK/test/blk3

预期输出:

/BOCK/blk1
/BOCK/blk2
/BOCK/blk3

我试过的代码:

use warnings;
use strict;
my @words;
open(my $infile,'<','file.txt') or die $!;
while(<$infile>)
{
    push(@words,split /\:/);
}
my $word=join("/",@words);
print $word;
close ($infile);
foreach my $word(@words)
{
    if($word=~ /(\w+\/\w+\/\w+)/)
    {
        print $word;
    }
}

最佳答案

去掉中间元素最简单的方法是使用splice .

while ( my $line = <DATA> ) {
    my @words;
    push( @words, split( /:/, $line ) );    # colon has no special meaning
    splice( @words, 1, 1 );
    print '/', join( '/', @words );
}

__DATA__
BOCK:top:blk1
BOCK:block2:blk2
BOCK:test:blk3

我假设你想对每一行都这样做。您执行其他操作的代码。因为你的 @words 是在 while 循环之外声明的,所以它在每次迭代中都会变大,并且每三个元素包含一个换行符 \n 因为你从不chomp。然后构建一个长的 $word,其中所有行中的所有单词都用斜杠 / 连接。之后,您尝试将其匹配为三个用斜线连接的单词,这很有效。但是你只有一个捕获组,所以你的 $3 永远不会被定义。

关于perl - 如何在 perl 中使用数组索引删除单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42244591/

相关文章:

multithreading - 如何在Perl中控制多线程同步

perl - 如何使用 Perl 以字节数组形式读取图像?

perl - Facebook::Graph 无法获取访问 token TLS 支持不可用

Perl 大容量下载直接到文件(以避免 RAM 过载)

regex - 删除字符串中的前导、尾随和多个空格

regex - 'if' 语句中的 Perl 正则表达式 [语法]

perl - 如何将我的 Bash 循环变量传递给 Perl 解释器?

html - 如何使用包装器将 CSS 文件应用于我的 Catalyst webapp 中的特定模板

perl - 如何比较哈希值的哈希值 perl

algorithm - 这个算法有名字吗?