我试图打印输入文件的第2列的第一个字母以及其他感兴趣的列。我不确定为什么从Matching first letter of word改编的以下脚本会让我使用未初始化的值$ columns [2]'警告。
输入文件示例:
ATOM 1 CAY GLY X 1 -0.124 0.401 -0.153 1.00 2.67 PEP
ATOM 2 HY1 GLY X 1 -0.648 0.043 -1.064 1.00 0.00 PEP
ATOM 3 HY2 GLY X 1 -0.208 1.509 -0.145 1.00 0.00 PEP
输出文件示例:
1 C -0.124 0.401 -0.153 1.00 2.67
2 H -0.648 0.043 -1.064 1.00 0.00
3 H -0.208 1.509 -0.145 1.00 0.00
脚本
open (my $input_fh, "<", $filename) or die $!;
while (my $data = <$input_fh>) {
chomp $data;
my @columns = split(/\t/, $data);
my ($firstletter) = ($columns[2] =~ m/^\d+(\w)/);
if (/CAY/../HT2/)
print $output_fh join ("\t", $columns[1], $firstletter, $columns[6], $columns[7], $columns[8]), "\n";
}
更新出于某种原因,由于if (/CAY/../HT2/)
语句而发生了警告 - 但由于输入文件相同,因此我并不需要这种情况。此外,由于第2列中没有数字,因此使用/^(\w)/
正则表达式更为合适。
答案 0 :(得分:1)
尝试调整分割后得到的内容:
my @columns = split(/\t/, $data);
local $" = "\n"; print "$data\nSplitted into:\n@columns";
猜猜你的文件有双\ t字符。我的意思是你可能有:
ATOM\t\t1 CAY GLY X...
所以第二列是undef
答案 1 :(得分:1)
是否有一些特殊原因必须拆分标签?正确地在任意文本文件中获取各种空白区域可能是挑剔的。如果没有必要,它似乎完全适合于拆分(任意)空间,然后抓住第一个字母
my @cols = split '\s+', $data;
my ($firstletter) = $cols[1] =~ m/^(\w)/;
我不确定其余的是什么,但您可以轻松地获取所需的列。
答案 2 :(得分:0)
听起来像是给出警告的代码不是你所展示的,而是像
那样($columns[2]) = ($columns[2] =~ m/^\d+(\w)/);
并且您正在收到警告,因为正则表达式因未找到数字而失败。也许你的意思是\d*
?
答案 3 :(得分:-3)
对我来说,也许我想使用cut命令和管道,然后使用split命令获取你想要的确切信息。