获取未进入最终输出的输入文件的行号

时间:2015-06-20 07:10:20

标签: perl

我在这里展示了一个小样本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";

}

1 个答案:

答案 0 :(得分:1)

$. variable

  
      
  • 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