Чтение входного файла и помещение его в массив с разделителем-пробелом в Perl

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

образец входного параметра - это текстовый файл, например:

0145 2145
4578 47896
45 78841
1249 24873

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

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

person Berkay Abidin şimşek    schedule 11.03.2012    source источник


Ответы (1)


Я думаю, это то, что вы хотите. @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.

person MattLBeck    schedule 11.03.2012
comment
Большое спасибо, но я хочу увидеть элементы массива, поэтому, когда я пишу foreach $value (@resultarray) { print($value); } затем он выдает ошибки, такие как глобальный символ $value требует явного имени пакета в c:\users...... как я могу распечатать элементы - person Berkay Abidin şimşek; 11.03.2012
comment
а также для вашего кода ошибка imageshack.us/photo/my- images/341/asdasdfasfagfq.png, - person Berkay Abidin şimşek; 11.03.2012
comment
Ошибка, которую вы получаете при печати, является результатом прагмы use warnings. Это требует, чтобы вы определили все переменные с именем пакета в начале. Так что в вашем случае вы должны написать my $value вместо $value. Написание Perl-кода таким образом — очень хорошая идея, потому что вы потратите намного меньше времени на отладку своих программ, когда привыкнете к этому. - person MattLBeck; 11.03.2012
comment
Другая ошибка связана с тем, что вам нужно использовать форму командной строки test1.pl inputfile.txt вместо test1.pl < inputfile.txt. Использование < в командной строке передает входной файл дескриптору файла STDIN. Но Perl также будет принимать строковые аргументы после команды выполнения. Это то, что входит в массив @ARGV. - person MattLBeck; 11.03.2012
comment
теперь это работает. большое спасибо, это именно то, что я хочу - person Berkay Abidin şimşek; 11.03.2012
comment
Рад, что смог помочь!. Я добавил немного больше о входных данных для вашей программы в ответ на случай, если вам нужно немного больше разъяснений. Убедитесь, что вы понимаете, как работает каждая часть Perl-программы :) - person MattLBeck; 11.03.2012