Perl - formatos
Perl usa um modelo de escrita chamado 'formato' para gerar relatórios. Para usar o recurso de formato do Perl, você deve definir um formato primeiro e, em seguida, usar esse formato para gravar dados formatados.
Defina um formato
A seguir está a sintaxe para definir um formato Perl -
format FormatName =
fieldline
value_one, value_two, value_three
fieldline
value_one, value_two
.
Aqui FormatNamerepresenta o nome do formato. ofieldlineé a forma específica, os dados devem ser formatados. As linhas de valores representam os valores que serão inseridos na linha do campo. Você termina o formato com um único ponto.
Próximo fieldlinepode conter qualquer texto ou campos. Os fieldholders mantêm espaço para dados que serão colocados lá em uma data posterior. Um fieldholder tem o formato -
@<<<<
Este campo é justificado à esquerda, com um espaço de campo de 5. Você deve contar o sinal @ e os sinais <para saber o número de espaços no campo. Outros titulares de campo incluem -
@>>>> right-justified
@|||| centered
@####.## numeric field holder
@* multiline field holder
Um exemplo de formato seria -
format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<<
$name $age
@#####.##
$salary
===================================
.
Neste exemplo, $ name seria escrito justificado à esquerda dentro de 22 espaços de caracteres e depois dessa idade seria escrito em dois espaços.
Usando o formato
Para invocar esta declaração de formato, usaríamos o write palavra-chave -
write EMPLOYEE;
O problema é que o nome do formato é geralmente o nome de um identificador de arquivo aberto e a instrução de gravação enviará a saída para esse identificador de arquivo. Como queremos que os dados sejam enviados ao STDOUT, devemos associar EMPLOYEE ao arquivo STDOUT. Primeiro, no entanto, devemos ter certeza de que STDOUT é nosso identificador de arquivo selecionado, usando a função select ().
select(STDOUT);
Em seguida, associaríamos EMPLOYEE a STDOUT definindo o novo nome de formato com STDOUT, usando a variável especial $ ~ ou $ FORMAT_NAME da seguinte maneira -
$~ = "EMPLOYEE";
Quando agora fazemos um write (), os dados seriam enviados para STDOUT. Lembre-se: se você for escrever seu relatório em qualquer outro identificador de arquivo ao invés de STDOUT, então você pode usar a função select () para selecionar aquele identificador de arquivo e o resto da lógica permanecerá o mesmo.
Vejamos o seguinte exemplo. Aqui temos valores codificados permanentemente apenas para mostrar o uso. No uso real, você lerá valores de um arquivo ou banco de dados para gerar relatórios reais e poderá precisar gravar o relatório final novamente em um arquivo.
#!/usr/bin/perl
format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<<
$name $age
@#####.##
$salary
===================================
.
select(STDOUT);
$~ = EMPLOYEE;
@n = ("Ali", "Raza", "Jaffer");
@a = (20,30, 40);
@s = (2000.00, 2500.00, 4000.000);
$i = 0;
foreach (@n) {
$name = $_;
$age = $a[$i];
$salary = $s[$i++];
write;
}
Quando executado, isso produzirá o seguinte resultado -
===================================
Ali 20
2000.00
===================================
===================================
Raza 30
2500.00
===================================
===================================
Jaffer 40
4000.00
===================================
Defina um cabeçalho de relatório
Tudo parece bem. Mas você estaria interessado em adicionar um cabeçalho ao seu relatório. Este cabeçalho será impresso no topo de cada página. É muito simples fazer isso. Além de definir um modelo, você teria que definir um cabeçalho e atribuí-lo à variável $ ^ ou $ FORMAT_TOP_NAME -
#!/usr/bin/perl
format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<<
$name $age
@#####.##
$salary
===================================
.
format EMPLOYEE_TOP =
===================================
Name Age
===================================
.
select(STDOUT);
$~ = EMPLOYEE;
$^ = EMPLOYEE_TOP;
@n = ("Ali", "Raza", "Jaffer");
@a = (20,30, 40);
@s = (2000.00, 2500.00, 4000.000);
$i = 0;
foreach (@n) {
$name = $_;
$age = $a[$i];
$salary = $s[$i++];
write;
}
Agora o seu relatório será semelhante a -
===================================
Name Age
===================================
===================================
Ali 20
2000.00
===================================
===================================
Raza 30
2500.00
===================================
===================================
Jaffer 40
4000.00
===================================
Defina uma paginação
E se o seu relatório ocupar mais de uma página? Você tem uma solução para isso, basta usar$% ou $ FORMAT_PAGE_NUMBER variável junto com o cabeçalho da seguinte forma -
format EMPLOYEE_TOP =
===================================
Name Age Page @<
$%
===================================
.
Agora, sua saída será a seguinte -
===================================
Name Age Page 1
===================================
===================================
Ali 20
2000.00
===================================
===================================
Raza 30
2500.00
===================================
===================================
Jaffer 40
4000.00
===================================
Número de linhas em uma página
Você pode definir o número de linhas por página usando uma variável especial $= (ou $ FORMAT_LINES_PER_PAGE), por padrão $ = será 60.
Definir um rodapé de relatório
Embora $ ^ ou $ FORMAT_TOP_NAME contenha o nome do formato do cabeçalho atual, não existe um mecanismo correspondente para fazer automaticamente o mesmo para um rodapé. Se você tiver um rodapé de tamanho fixo, poderá obter os rodapés verificando a variável $ - ou $ FORMAT_LINES_LEFT antes de cada write () e imprimir o rodapé você mesmo, se necessário, usando outro formato definido a seguir -
format EMPLOYEE_BOTTOM =
End of Page @<
$%
.
Para um conjunto completo de variáveis relacionadas à formatação, consulte a seção Variáveis especiais do Perl .