Как распечатать / извлечь информацию, указанную в столбце из двумерного массива в Perl? - PullRequest
2 голосов
/ 15 июля 2009

У меня есть выходной файл, который представляет собой двумерный массив (этот файл был сгенерирован после запуска сценария, написанного для создания двумерного массива), и я должен прочитать информацию в определенном столбце, скажем в столбце 1. Другими словами, как Я читаю и распечатываю перечисленную информацию, соответствующую всем строкам, в столбце 1.

Есть предложения?

__DATA__
   1  2  3  4  5  6  7  8  9
   A  B  C  D  E  F  G  H  I
  93  48 57 66 52 74 33 22 91

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

ВЫВОД:

1
A
93

Ответы [ 7 ]

3 голосов
/ 15 июля 2009

Окончательный вариант после всех исправлений:

#!/usr/bin/perl

use strict;
use warnings;

my $column_to_show = 0;

while ( <DATA> ) {
    last unless /\S/;
    print +(split)[$column_to_show], "\n";
}

__DATA__
   1  2  3  4  5  6  7  8  9
   A  B  C  D  E  F  G  H  I
  93  48 57 66 52 74 33 22 91

Выход:

C:\Temp> u
1
A
93

Объяснение print +(split)[$column_to_show], "\n";:

perldoc -f split

Разбивает строку EXPR на список строк и возвращает этот список. ... Если EXPR опущен, разбивает строку $ _. Если PATTERN также опущен, разбивает пробел (после пропуска любого начального пробела).

Итак: (split)[3] выбирает четвертый элемент списка, возвращаемый split. + перед (split) необходимо, чтобы perl правильно проанализировал выражение. См perldoc -f print:

Также будьте осторожны, чтобы не следовать напечатать ключевое слово с левой круглой скобкой если вы не хотите соответствующий правая скобка, чтобы прекратить аргументы для печати & mdash; вставить + или поставить круглые скобки вокруг всех аргументы.

Я настоятельно рекомендую каждому программисту Perl периодически просматривать всю документацию perldoc perltoc . Это на вашем компьютере.

3 голосов
/ 10 февраля 2011
my $line ;

foreach $line (@DATA)
{
   my @DATA1 = split( / +/, "$line" );
   print "first element of array is $DATA1[0]";        
}


__DATA__

 1  2  3  4  5  6  7  8  9
 A   B  C  D  E  F  G  H  I
 93  48 57 66 52 74 33 22 91

ВЫВОД: -

 1
 A
 93
1 голос
/ 16 июля 2009

Это может быть то, что вы хотите:

use English qw<$OS_ERROR>; # Or just use $! 
use IO::Handle;

my @columns;

open my $fh, '<', 'columns.dat' or die "I'm dead. $OS_ERROR";
while ( my $line = <$fh> ) { 
    my @cols = split /\s+/, $line;
    $columns[$_][$fh->input_line_number()-1] = $cols[$_] foreach 0..$#cols;
}
$fh->close();
1 голос
/ 16 июля 2009
perl -lne '@F = split /\s+/ and print $F[1]'
1 голос
/ 16 июля 2009

Функция карты - ваш друг:

open FILE, "data.txt";
while ($line = <FILE>) {
   chomp($line);
   push @data, [split /[, ]+/, $line];
}
close FILE;

@column1 = map {$$_[0]} @data;

print "@column1\n";

А в data.txt что-то вроде:

1, 2, 3, 4
5, 6, 7, 8
9, 10, 11, 12
13, 14, 15, 16
1 голос
/ 15 июля 2009

Попробуйте поиграть с этим кодом. В основном я загружаю данные в массив массивов

Каждая строка является ссылкой на строку.

#!/usr/bin/perl

use strict;
use warnings;    

my $TwoDimArray;
while (my $line=<DATA>) {
   push @$TwoDimArray, [split(/,/,$line)];
};

for my $column (0..2) {
   print "[$column,0] : " . $TwoDimArray->[0]->[$column] ."\n";
   print "[$column,1] : " . $TwoDimArray->[1]->[$column] ."\n";
   print "\n";
}

__DATA__
1,2,3,04,05,06
7,8,9,10,11,12
0 голосов
/ 15 июля 2009

Вы можете получить к ним доступ напрямую по элементу.

$arrays[0][0] = 1;
$arrays[0][1] = 2;
$arrays[1][0] = 3;
$arrays[1][1] = 4;

for (my $i = 0; $i <= $#{$arrays[1]}; $i++) {
    print "row for $i\n";
    print "\tfrom first array: " . $arrays[0][$i] . "\n";
    print "\tfrom second array: " . $arrays[1][$i] . "\n";
}

печать

row for 0
    from first array: 1
    from second array: 3
row for 1
    from first array: 2
    from second array: 4
...