2012-03-11 3 views
4

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

входной параметр образец представляет собой TXT-файл, например:

0145 2145 
4578 47896 
45 78841 
1249 24873 

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

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

ответ

5

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

поскольку это только имена файлов, вам нужно оп перед файлом, прежде чем вы получите доступ к содержимому файла. Итак, для inputfile1.ТХТ:

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.

+0

спасибо очень много, но я хочу, чтобы увидеть элементы массива так, когда я пишу Еогеасп $ значения (@resultarray) { печать ($ значения); } то это дает ошибку, как глобального символ «$ значения» требует явного имени пакета в C: \ Users ...... как я могу напечатать элементы –

+0

, а также для вашего кода, ошибка http://imageshack.us/photo/my-images/341/asdasdfasfagfq.png/ что –

+0

Ошибка, возникающая при печати, является результатом использования прагмы 'use warnings'. Он требует, чтобы вы определили все переменные с именем пакета в начале. Поэтому в вашем случае вы должны написать 'my $ value' вместо' $ value'. Написание Perl-кода таким образом является * очень хорошей идеей *, потому что вы потратите гораздо меньше времени на отладку своих программ, как только вы привыкнете к нему. – MattLBeck

 Смежные вопросы

  • Нет связанных вопросов^_^