Combinando um padrão em Perl

1

Eu tenho um arquivo de entrada abaixo que contém:

000ABCDEFGHIJKLMN2018022623595900021
CGT11~|~|110~|~|221~|~|H0331~|~|~|~|
CGT11~|~|110~|~|222~|~|H0332~|~|~|~|
CGT11~|~|110~|~|223~|~|H0335~|~|~|~|
CGT11~|~|110~|~|224~|~|H0333~|~|~|~|
99800000000000000011~|~|~|~|~|~|~|~|

Eu quero contar o número de linhas e ir para a última linha do arquivo e marcar "999". Se coincidir, ele prosseguirá para a próxima etapa ou então uma mensagem de erro será exibida. Atualmente, a última linha do meu arquivo de entrada está tendo "998", por isso, será exibida uma mensagem de erro. Como posso fazer isso em Perl? Alguém pode me ajudar a resolver o problema?

Meu código atual está abaixo de

#!/usr/bin/perl
open(FILE, "<deep.txt") or die "Could not open file: $!";

my $lines = 0;

while (<FILE>) {
    $lines++;
if($Number =~ m/\d{1,3}/){

     $N = $Number;
print "$N";
 }
}

print "The no of lines present is $lines \n";
    
por Deep Mukherjee 27.02.2018 / 06:02

2 respostas

1

Não totalmente certo, mas isso pode ajudar

#!/usr/bin/perl
use strict;
use warnings;

my $fname = "deep.txt";
open(my $fh, "<:encoding(ASCII)", $fname) || die "cannot open $fname for reading";

my $num = 0;

while(<$fh>)
{
    $num = substr $_, 0, 3 if eof;
}
close($fh) || warn "cannot close $fname";

print "Oops, last line doesn't start with 999!\n" if $num != 999;

A verificação eof ajuda a saber se é a última linha de arquivo a ser lida


O loop while também pode ser reduzido para uma linha:

eof and $num = substr $_, 0, 3 while(<$fh>);


Leitura adicional:

por 27.02.2018 / 07:17
0

Usando awk :

awk 'END { if ($0 !~ /^999/) print "error"; else printf("Lines in file: %d\n", NR) }' file

Se a última linha do arquivo não iniciar com 999 , a string error será exibida. Caso contrário, o número de linhas no arquivo será exibido em uma mensagem curta.

A mesma coisa com o Perl:

perl -ne '$line=$_; END { if ($line !~ /^999/) { print "error\n" } else { printf "Lines in file: %d\n", $. } }' file

O script (embelezado):

$line = $_;

END {
    if   ( $line !~ /^999/ ) { print "error\n" }
    else                     { printf "Lines in file: %d\n", $. }
}

Isso define $line para a linha atual de entrada.

O bloco END é executado quando nenhuma entrada adicional está disponível. Ele testa se o último $line começa com 999 ou não e imprime um erro ou o número de linhas. A variável $. é uma variável Perl especial que corresponde a NR em awk (o número de linhas / registros lidos).

    
por 06.04.2018 / 12:40

Tags