/ / Perl - Печат на първата буква от колона - perl

Perl - Печат на първата буква от колона - perl

Опитвам се да отпечатам първата буква от колона2 на входния файл, както и други колони от интерес. Не съм сигурен защо следният скрипт, адаптиран от Съвпадение на първата буква от думата ми дава предупреждение "Използване на неинициализирана стойност $ колони [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";
}

UPDATE Предупреждението е възникнало поради if (/CAY/../HT2/) изявление по някаква причина - но тъй като входните файлове са идентични, аз не "наистина се нуждаят от това условие. Също така, тъй като няма цифри в column2 е по-подходящо да се използва /^(w)/ регулярен.

Отговори:

1 за отговор № 1

Има ли някаква конкретна причина, която трябваразделен на разделите? Първи различни видове бяло пространство в произволен текстов файл правилно може да бъде придирчив. Ако не е необходимо, изглежда напълно подходящо просто да се раздели с (всяко) пространство, след което да вземете първата буква

my @cols = split "s+", $data;
my ($firstletter) = $cols[1] =~ m/^(w)/;

Не съм сигурен какво правят останалите, но лесно можете да изтръгнете необходимите ви колони.


1 за отговор № 2

Опитайте се да отстраните грешките, които получавате след разделяне:

my @columns = split(/t/, $data);
local $" = "n"; print "$datanSplitted into:n@columns";

Както предполагам, вашият файл има двойни символи. Искам да кажа, вероятно имате: ATOMtt1 CAY GLY X... така че втората колона е undef


0 за отговор № 3

Звучи ми като код, който даде това предупреждение, не е това, което показваш, а вместо това имаше нещо подобно

($columns[2]) = ($columns[2] =~ m/^d+(w)/);

И получавате предупреждението, защото regex се проваля поради липса на цифра. Може би си имал предвид d*?


-3 за отговор № 4

За мен, може би бих искал да използвам команда за рязане и тръбопровод, след това командата split, за да получите точната информация, която искате.