我在这里展示了一个小样本Perl脚本部分,如下所示,基于许多if-else条件的输入文件在@final_records中获得最终输出。我的问题是如何轻松检测在此代码中被拒绝的输入文件行号,并可能将这些行放在单独的新文件中?
while (<MY_INP_FILE>) {
chomp;
next if $_ =~ /^(NAME)/;
( $secname, $id_my_sec_num_des,
$my_source, $id_my_sec_num_src,
$id_my_unique, $security_typ,
$my_sector_des, $id_my_global,
$composite_id_my_global,
) = split( /\|/, $_ );
if ( exists $trexcp{$id_my_global} ) {
$my_match_ticker = $trexcp{$id_my_global};
}
else {
$ticker = $id_my_sec_num_des;
$my_match_ticker = $id_my_sec_num_des;
if ( $my_sector_des eq "BSE" ) {
( $indx_tick, $indx_val ) = split( ' ', $id_my_sec_num_des );
$my_match_ticker = $indx_tick;
}
elsif ( $my_sector_des eq "PFD" || $my_sector_des eq "COMP" ) {
( $base_ticker, $div_percent, $matdt, $series )
= split( " ", $id_my_sec_num_des );
if ( length($base_ticker) > 3 ) {
$base_tick = substr( $base_ticker, 0, 3 );
}
else { $base_tick = $base_ticker; }
if ( $my_sector_des eq "PFD" && $matdt ne "" ) {
$series =~ s /([A-Z])([A-Z])/$2/;
$my_match_ticker = $base_tick . ".PR" . $series;
}
}
elsif ( $my_sector_des eq "EQ" ) {
if ( $my_source =~ m/^(BD|IN|MM|KS|KF|SP)$/ ) {
if ( $my_source eq "MM" ) {
$my_match_ticker =~ s/(\s+)/ /g;
@mm_tick = split( ' ', $my_match_ticker );
if ( ( $my_match_ticker !~ /\*/ )
&& ( $#mm_tick eq 2 )
&& ( $mm_tick[2] ne " " ) )
{
$my_match_ticker = "$mm_tick[0]" . "$mm_tick[2]";
}
$my_match_ticker =~ s/\*|\///g;
}
}
elsif (( $my_source eq "HK" )
&& ( length($id_my_sec_num_des) < 4 ) )
{
if ( $id_my_sec_num_des =~ m/^(\d\d\d)$/ ) {
$my_match_ticker
=~ s/$id_my_sec_num_des/0$id_my_sec_num_des/;
}
}
}
}
$final_my_records = join(
"|",
( $id_my_global, $id_my_sec_num_src,
$id_my_unique, $secname,
$id_my_sec_num_des, $my_source,
$security_typ, $my_sector_des,
$composite_id_my_global, $my_match_ticker
)
);
push @final_records, "$final_my_records\n";
}
答案 0 :(得分:1)
- 的
HANDLE->input_line_number( EXPR )
强>- 的
$INPUT_LINE_NUMBER
强>- 的
$NR
强>$.
访问的最后一个文件句柄的当前行号。
Perl中的每个文件句柄都计算已经过的行数 从中读取。 (取决于
$/
的值,Perl对什么的看法 构成一条线可能与你的不匹配。)当读取一条线时 文件句柄(通过readline()
或<>
),或tell()
或。{seek()
被调用,$.
成为行计数器的别名 对于那个文件句柄。您可以通过指定
文件句柄关闭时会重置$.
来调整计数器,但这不会 实际上移动搜索指针。本地化$.
不会本地化 文件句柄的行数。相反,它将本地化perl的 文件句柄$.
当前是别名的概念。
$.
,但打开文件句柄时不会重置close()
文件句柄重新打开,没有干预perlop
。更多 详细信息,请参阅&#34; I / O运营商&#34;在<>
。因为ARGV
永远不会 显式关闭,行号在eof
个文件中增加(但请参阅perlfunc
中的HANDLE->input_line_number(EXPR)
中的示例。您也可以使用
.
来访问 给定文件句柄的行计数器,无需担心 处理您上次访问的内容。助记符:许多程序使用
push @final_records, "$final_my_records\n";
表示当前行号。
添加记录next if $_ =~ /^(NAME)/;
的代码超出了所有意大利面条if-else代码。这意味着拒绝记录的唯一地方是if ( /^(NAME)/ ) {
... # put your code here
next;
}
。所以做一些像:
countries[0].states[0].cities[0].zipCodes