Опитвам се да отпечатам първата буква от колона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, за да получите точната информация, която искате.