使用Perl读取文件中列的有效方法

使用Perl读取文件中列的有效方法,perl,multiple-columns,Perl,Multiple Columns,我有一个这样的输入文件,由换行符分隔 AAA BBB BBA 计算列(垂直)的最有效方法是什么,第一个是第一个,第二个是第二个,等等 样本输出: ABB ABB ABA 我一直在使用下面的内容,但是我不知道如何从中删除标量上下文。如有任何提示,我们将不胜感激: while (<@seq_prot>){ chomp; my @sequence = map substr (@seq_prot, 1, 1), $start .. $end; @sequen

我有一个这样的输入文件,由换行符分隔

AAA
BBB
BBA
计算列(垂直)的最有效方法是什么,第一个是第一个,第二个是第二个,等等

样本输出:

ABB 
ABB 
ABA
我一直在使用下面的内容,但是我不知道如何从中删除标量上下文。如有任何提示,我们将不胜感激:

while (<@seq_prot>){
    chomp; 
    my @sequence = map substr (@seq_prot, 1, 1), $start .. $end;
    @sequence = split;
}
while(){
咀嚼;
my@sequence=map substr(@seq_prot,1,1),$start..$end;
@序列=分裂;
}

我的想法是使用子字符串获取输入的第一个字母(在本例中为A),并循环所有其他字母(第二个A和B)。然后我将增加循环数+1,以获得下一行,直到到达终点。当然,我似乎无法启动第一部分,因此非常感谢您的帮助,我在这一部分遇到了困难

您必须为每列读取一次文件,或者存储信息,稍后再查看数据结构

我最初是从数组的角度来考虑的,但我不想深入讨论

我将假设每条线的长度相同。这样就更简单了。我们可以使用将您的行拆分为单个字母:

my = $line = "ABC"
my @split_line = split //, $line;
这将使我们:

$split_line[0] = "A";
$split_line[1] = "B";
$split_line[2] = "C";
$vertical_array[0] = "A1";
$vertical_array[1] = "B2";
$vertical_array[2] = "C3";
如果我们现在将每个字母放入一个
@vertical\u数组
,会怎么样

my @vertical_array;
for my $index ( 0..@#split_line ) {
   $vertical_array[$index] .= "$split_line[$index];
}
现在让我们用下一行来做这件事:

$line = "123";
@split_line = split //, $line;
for my $index ( 0..@#split_line ) {
   $vertical_array[$index] .= "$split_line[$index];
}
这将使我们:

$split_line[0] = "A";
$split_line[1] = "B";
$split_line[2] = "C";
$vertical_array[0] = "A1";
$vertical_array[1] = "B2";
$vertical_array[2] = "C3";
如您所见,我正在为每个交互构建$vertical_数组:

use strict;
use warnings;
use autodie;
use feature qw(say);

my @vertical_array;
while ( my $line = <DATA> ) {
    chomp $line;
    my @split_line = split //, $line;
    for my $index ( 0..$#split_line )  {
        $vertical_array[$index] .= $split_line[$index];
    }
}

#
# Print out your vertical lines
#
for my $line ( @vertical_array ) {
    say $line;
}

__DATA__
ABC
123
XYZ
BOY
FOO
BAR

如果我使用了引用,我可能会构建一个数组,然后翻转它。这可能更有效,但更复杂。但是,在处理不同长度的行时,这可能会更好。

基本上,您正在尝试转置数组

这可以很容易地使用

将输出:

A1aZ
B2bY
C3cX
D4d
E5e
F6f
G7g
H8h
I9i
J0j
K1k
L2l
M3m
N4n
O o
P p
Q q
R
S

如果我想从$vertical_数组中选择一个大于列长度的区域。。。有可能吗。以您的数据为例,如果我想取B列和C列,不包括A列,我是否需要为此创建另一个循环,或者是否有更快的方法?在这种情况下,使用
Array::Transpose
可能会更好。但是,您需要了解。这将允许您拥有一个数组并模拟二维数组。有一个极好的例子。在Perl中。
A1aZ
B2bY
C3cX
D4d
E5e
F6f
G7g
H8h
I9i
J0j
K1k
L2l
M3m
N4n
O o
P p
Q q
R
S