Чтение входного файла и помещение его в массив с пробелом в Perl - PullRequest
4 голосов
/ 11 марта 2012

Я пытаюсь взять входной файл с массивом @ARGV и записать все его элементы в массив с пробелом в perl.

Пример входного параметра представляет собой текстовый файл, например:

0145 2145
4578 47896
45 78841
1249 24873

(есть несколько строк, но здесь это не показано) проблема:

  1. Я не знаю, как взять, например, ARG [0] в массив
  2. Я хочу взять каждую строку этого входного файла как одну строку, другими словами, line1 0145 2145 не будет строкой, это будет две отдельные строки, разделенные пробелом.

1 Ответ

6 голосов
/ 11 марта 2012

Я думаю, это то, что вы хотите.@resultarray в этом коде будет содержать список цифр.

Если вы даете своей программе имя файла для использования в качестве ввода из командной строки, снимите его с массива ARGV и откройте егов качестве дескриптора файла:

my $filename = $ARGV[0];
open(my $filehandle, '<', $filename) or die "Could not open $filename\n";

Получив дескриптор файла, вы можете перебирать каждую строку файла, используя цикл while.chomp убирает символ новой строки с конца каждой строки.Используйте split, чтобы разбить каждую строку на основе пробелов.Это возвращает массив (@linearray в моем коде), содержащий список чисел в этой строке.Затем я push мой массив строк до конца моего @resultarray.

my @resultarray;
while(my $line = <$filehandle>){
    chomp $line;
    my @linearray = split(" ", $line);
    push(@resultarray, @linearray);
}

И не забудьте добавить

use warnings;
use strict;

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


Просто чтобы уточнить, как вы можете справляться с различными входами в вашу программу.Следующая команда:

perlfile.pl < inputfile.txt

Возьмет содержимое файла inputfile.txt и передаст его в файловый дескриптор STDIN.Затем вы можете использовать этот файловый дескриптор для доступа к содержимому inputfile.txt

while(my $line = <STDIN>){
    # do something with this $line
}

Но вы также можете дать вашей программе несколько имен файлов для чтения, поместив их после команды выполнения:

perlfile.pl inputfile1.txt inputfile2.txt

Эти имена файлов будут читаться как строки и помещаться в массив @ARGV, так что массив будет выглядеть следующим образом:

@ARGV:
    [0] => "inputfile1.txt"
    [1] => "inputfile2.txt"

Поскольку это только имена файлов, вам необходимо открытьфайл в Perl, прежде чем вы получите доступ к содержимому файла.Поэтому для inputfile1.txt:

my $filename1 = shift(@ARGV);
open(my $filehandle1, '<', $filename1) or die "Can't open $filename1";

while(my $line = <$filehandle1>){
    # do something with this line
}

Обратите внимание, как я использовал shift на этот раз, чтобы получить следующий элемент в массиве @ARGV.См. perldoc для более подробной информации о смене.А также больше информации о open .

...