печатать определенную область INFILE, используя perl - PullRequest
0 голосов
/ 06 июня 2018

У меня есть файл в формате ниже

locale,English,en_AU,6251
locale,French,fr_BE,25477
charmap,English,EN,5423

И я хотел бы использовать perl, чтобы распечатать что-то с опцией "-a", следующей за файлом, и вывести что-то вроде

Available locales:
en_Au
fr_BE
EN

Для этого у меня есть скрипт perl ниже

$o = $ARGV[0];
$f = $ARGV[1];
open (INFILE, "<$f") or die "error";
my $line = <INFILE>;
my @fields = split(',', $line);
if($o eq "-a"){
  if(!$fields[2]){print "No locales available\n";}
  else{print "Available locales: \n";
    while($fields[2]){print "$fields[2]\n";}
  }
}
close(INFILE);

И у меня здесь три вопроса.1. Мой скрипт всегда будет печатать только первый язык "en_Au".2. он должен быть в состоянии проверить, является ли файл пустым, но если файл является чисто пустым, он ничего не выводит, но если я введу две пустые строки в файле, он выведет две строки «Нет доступных локалей».3. Фактически, в части (! $ Filed [2]) я должен проверить, является ли файл пустым или нет доступных локалей, если так, нужно ли мне помещать здесь регулярное выражение, чтобы проверить, является ли он локалью??Надеюсь, кто-нибудь может помочь мне разобраться с этим!Большое спасибо !!!

1 Ответ

0 голосов
/ 06 июня 2018

Самая большая пропущенная вещь - это цикл по строкам из файла, в котором вы затем обрабатываете по одной строке за раз.Комментарии следуют за кодом.

use warnings;
use strict;
use feature 'say';
use Getopt::Long;

#my ($opt, $file) = @ARGV;  # better use a module
my ($opt, $file);
Getoptions( 'a' => \$opt, 'file=s' => \$file ) or usage();
usage() if not $file;  # mandatory argument    

open my $fh, '<', $file  or die "Can't open $file: $!";

while (my $line = <$fh>) {
    chomp $line;
    my @fields = split /,/, $line;
    next if not $fields[2];
    if ($opt) {
        say $fields[2];
    }   
}
close $fh;

sub usage {
    say STDERR "Usage: $0 [-a] --file filename";
    exit 1;
}

Это печатает желаемый результат.(Это простое условие для $fields[2] действительно все, что вам нужно?)

Комментарии

  • Всегда иметь use warnings; и use strict; в начале

  • Я не рекомендую именовать переменные из одной буквы.Кто-то забывает, что они имеют в виду, это усложняет выполнение кода, и слишком легко совершать глупые ошибки

  • @ARGV можно назначать переменным в списке.Гораздо лучше использовать модуль Getopt :: Long , который проверяет вызовы и позволяет значительно упростить смену интерфейса.Я установил параметр -a в качестве «флага», поэтому он просто устанавливает переменную ($opt), если она задана.Если это должно иметь возможные значения вместо этого, используйте 'a=s' => \$opt и проверьте значение.

  • Используйте лексические файловые дескрипторы и три аргумента open , open my $fh, '<', $file ...

  • При die -ной печати ошибка , die "... $!";, с использованием $! переменная

  • «ромбический» (угол) оператор , <$fh>, считывает одну строку из файла, открытого с $fh при использовании в скалярный контекст как в $line = <$fh>.Он перемещает указатель в файле при чтении строки, поэтому при следующем использовании он возвращает следующую строку.Если вы используете его в списке контекста , тогда он возвращает все строки, но когда вы обрабатываете файл, вы обычно хотите идти построчно.

Некоторые из описанныхлогика и требования мне не ясны, но, надеюсь, приведенный выше код будет легче настроить по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...