Loops Perl:向foreach循环添加异常
我不熟悉堆栈溢出,我想就Perl代码中的一个小问题征求一些建议。 简而言之,我编写了一个小程序,它从预定义数组中打开文本文件,然后搜索其中的某些字符串,最后打印出包含该字符串的行Loops Perl:向foreach循环添加异常,loops,perl,foreach,line-breaks,Loops,Perl,Foreach,Line Breaks,我不熟悉堆栈溢出,我想就Perl代码中的一个小问题征求一些建议。 简而言之,我编写了一个小程序,它从预定义数组中打开文本文件,然后搜索其中的某些字符串,最后打印出包含该字符串的行 my @S1A_SING_Files = ( 'S1A-001_SING_annotated.txt', 'S1A-002_SING_annotated.txt', 'S1A-003_SING_annotated.txt', 'S1A-004_SING_annotated.txt',
my @S1A_SING_Files = (
'S1A-001_SING_annotated.txt',
'S1A-002_SING_annotated.txt',
'S1A-003_SING_annotated.txt',
'S1A-004_SING_annotated.txt',
'S1A-005_SING_annotated.txt'
);
foreach (@S1A_SING_Files) {
print ("\n");
print ("Search results for $_:\n\n");
open (F, $_) or die("Can't open file!\n");
while ($line = <F>) {
if ($line =~ /\$(voc)?[R|L]D|\$Rep|\/\//) {
print ($line);
}
}
}
close (F);
如果文件为$S1A\u SING\u Files[0],则不会执行。如果该文件是以下文件之一,则应正常执行。你认为这能实现吗
提前非常感谢 是的。只需为第一个文件添加一个检查。更改:
print ("\n");
致:
如果数组包含唯一字符串,则可以使用以下命令:
print("\n") if $_ ne $S1A_SING_Files[0]; # Different stringification than 1st element?
即使数组包含非字符串或重复值(而且速度也更快),以下操作也会起作用:
对于魔法阵列,上述两种方法都可能失败。最可靠的解决方案是迭代索引
for my $i (0..$#S1A_SING_Files) {
my $file = $S1A_SING_Files[$i];
print("\n") if $i; # Different index than 1st element?
...
}
您的代码可以用以下形式编写
use strict;
use warnings;
my @S1A_SING_Files = (
'S1A-001_SING_annotated.txt',
'S1A-002_SING_annotated.txt',
'S1A-003_SING_annotated.txt',
'S1A-004_SING_annotated.txt',
'S1A-005_SING_annotated.txt'
);
foreach (@S1A_SING_Files) {
print "\n" unless $_ ne $S1A_SING_Files[0];
print "Search results for $_:\n\n";
open my $fh, '<', $_ or die("Can't open file!\n");
m!\$(voc)?[R|L]D|\$Rep|//! && print while <$fh>;
close $fh;
}
使用严格;
使用警告;
我的@S1A\u SING\u文件=(
“S1A-001\u SING\u annotated.txt”,
“S1A-002\u SING\u annotated.txt”,
“S1A-003\u SING\u annotated.txt”,
“S1A-004\u SING\u annotated.txt”,
“S1A-005\u SING\u annotated.txt”
);
foreach(@S1A\u SING\u文件){
打印“\n”,除非$\ne$S1A\u SING\u文件[0];
打印“美元搜索结果:\n\n”;
打开我的$fh,'如果数组可以包含重复的值,则此操作不起作用,但是如果\$\uu!=\$S1A\u SING\u Files[0]
起作用。速度也更快:)
print("\n") if \$_ != \$S1A_SING_Files[0]; # Different scalar than 1st element?
for my $i (0..$#S1A_SING_Files) {
my $file = $S1A_SING_Files[$i];
print("\n") if $i; # Different index than 1st element?
...
}
use strict;
use warnings;
my @S1A_SING_Files = (
'S1A-001_SING_annotated.txt',
'S1A-002_SING_annotated.txt',
'S1A-003_SING_annotated.txt',
'S1A-004_SING_annotated.txt',
'S1A-005_SING_annotated.txt'
);
foreach (@S1A_SING_Files) {
print "\n" unless $_ ne $S1A_SING_Files[0];
print "Search results for $_:\n\n";
open my $fh, '<', $_ or die("Can't open file!\n");
m!\$(voc)?[R|L]D|\$Rep|//! && print while <$fh>;
close $fh;
}