我试图打印文件中的每一行,如果它们在特定位置包含单个字符,那么首先是' +'但我将使用' - '运行相同的程序。代码运行但没有提供输出,我确信这是一个非常简单的错误,因为我检查了正则表达式并且有效!
FILE1数据:
3628 -a
9712 +T
11004 -a
11379 -a
12715 +T
14184 +T
输出:
9712 +T
12715 +T
14184 +T
代码:
#!/usr/bin/perl
use strict;
use warnings;
use autodie;
my $outputfile = "/Users/edwardtickle/Documents/indelfinal.txt";
open FILE1, "/Users/edwardtickle/Documents/indelcount.txt";
open (OUTPUTFILE, ">$outputfile");
while (<FILE1>) {
if (/^(\d+)\s+(\S)(\S)/) {
if ($2 =~ m/'+'/) {
print OUTPUTFILE "$1 $2$3\n";
}
}
}
close FILE1;
close OUTPUTFILE;
干杯!
答案 0 :(得分:4)
if ($2 =~ m/'+'/) {
这是一个正则表达式匹配,因此它没有按照您的想法执行。如果$2
(+
或-
或其他)包含至少两个撇号的序列($2
的长度始终为1,那么这将匹配,因此这可以永远不会发生。)
您需要进行字符串比较:
if ( $2 eq '+' ) {
答案 1 :(得分:1)
以下正则表达式可以帮助您确定字符串中第二个(特定)位置的+
m/\+.$/
例如
#!/usr/bin/perl
use strict;
use warnings;
use autodie;
open FILE1, "input";
while (<FILE1>) {
if ($_ =~ m/\+.$/ ) {
print "$_";
}
}
close FILE1;
将产生输出
9712 +T
12715 +T
14184 +T
它的作用是什么?
\+
与+
.
匹配任何单个字符
$
匹配字符串的结尾。
答案 2 :(得分:0)
您的输入中似乎只能有一个+
或一个-
,因此在您进行测试之前将这一行拆分为字段是没有意义的。这就是你所需要的一切。
while (<FILE1>) {
print OUTPUTFILE $_ if /\+/;
}
或,在单行命令中
perl -ne'print if /\+/' indelcount.txt > indelfinal.txt
请注意,后者要求您当前的工作目录为/Users/edwardtickle/Documents
答案 3 :(得分:0)
它给出了你期望的东西
use warnings; use strict;
open('new',"file1");
my @ar = <new>;
my @vz = grep{m/\+/g} @ar;
print @vz,"\n";
我使用grep
运算符将特定单词与文件中的句子匹配。