Mostrar el contenido del archivo según el número de línea

Escriba un programa Perl para mostrar el contenido del archivo en orden ordenado (ascendente) en función de los números de línea proporcionados a través de argumentos de línea de comandos. Tenga en cuenta que los números de línea pueden estar en cualquier orden y generar un error si el número de línea es grande.

Sintaxis: perl Filename.pl File_to_be_read.abc x y z
Aquí,
Filename.pl es el nombre del archivo que contiene el script perl
File_to_be_read.abc es el nombre del archivo que se va a leer. Este archivo puede ser de cualquier tipo. Ex-texto, guión, etc.
xyz son los números de línea que se van a imprimir.

Enfoque:
ordene los números de línea excluyendo el primer argumento, que es el nombre del archivo. Una vez ordenado, lea todo el contenido del archivo en una array usando una declaración única (my @file = <FNAME>) . Ahora recorra los números de línea ordenados y muestre el contenido del archivo pasando el número de línea como índice a la array de archivos como ( print “$file[$var-1]\n”; ).

Ejemplo 1: Considere un archivo Hola.txt

#!/usr/bin/perl
use warnings;
use strict;
   
# Check if line numbers are given as an input
if (@ARGV < 2)
{
    die "usage: pick file_name line_no1 line_no2 ...";
}
   
open FNAME, $ARGV[0] or die "cannot open file";
  
# Exclude the first argument 
# for sorting line numbers
shift (@ARGV); 
my @line_numbers = sort { $a <=> $b } @ARGV; 
   
# Read whole file content into an array 
# and removes new line using chomp()
chomp (my @file = <FNAME>);
   
foreach my $var (@line_numbers) 
{
    if ($var> $#file)
    {
        print "Line number $var is too large\n";
        next;
    }
    print "$file[$var-1]\n";
}
close FNAME;

Producción:

Ejemplo 2: Leer el mismo archivo de script

#!/usr/bin/perl
use warnings;
use strict;
   
# Check if line numbers are given as an input
if (@ARGV < 2)
{
    die "usage: pick file_name line_no1 line_no2 ...";
}
   
open FNAME, $ARGV[0] or die "cannot open file";
  
# Exclude the first argument 
# for sorting line numbers
shift (@ARGV); 
my @line_numbers = sort { $a <=> $b } @ARGV; 
   
# Read whole file content into an array 
# and removes new line using chomp()
chomp (my @file = <FNAME>);
   
foreach my $var (@line_numbers) 
{
    if ($var> $#file)
    {
        print "Line number $var is too large\n";
        next;
    }
    print "$file[$var-1]\n";
}
close FNAME;

Producción:

Si el número de línea pasado no está en el archivo:

Publicación traducida automáticamente

Artículo escrito por kani_26 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *