如何使用 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/