Вероятно, в действительности нет веских оснований для того, чтобы вначале загружать файл, а не обрабатывать его построчно. Процесс за строкой будет масштабироваться лучше. Имея это в виду, я бы сделал это так:
use warnings;
use strict;
my $file = 'DIP.txt';
open my $in_fh, '<', $file or die $!;
open my $out_fh, '>', 'new' . $file or die $!;
while ( <$in_fh> ) {
chomp;
next unless length $_; # Skip blank lines.
my ( @columns ) = split /\s+/, $_; # Split on whitespace (you may prefer \t).
foreach my $column ( @columns ) {
( $column ) = $column =~ m{([^:]+)$};
}
local $" = "\t";
print $out_fh "@columns\n";
}
Во-первых, используется версия с тремя аргументами open как для входного файла, так и для выходного файла. Это хорошая привычка. Далее он использует лексические файловые дескрипторы вместо старых файловых дескрипторов файлового глобуса. Лексикалы автоматически закрываются, когда они выходят из области видимости и не становятся частью глобальной таблицы символов.
Затем сценарий читает файл и обрабатывает его построчно, чтобы избежать ошибок. Это может быть полезно, если файл потенциально увеличивается в размерах или если вы находитесь в среде, где использование памяти стоит дорого. Если у вас нет веских причин для того, чтобы выпить, вы можете также привыкнуть не делать этого.
Тогда я разделился на пустое место. Вы можете разделить на вкладки. Если в столбцах нет встроенных пробелов, то так или иначе работает. Затем я перебираю два столбца, сопоставляя и получая из каждого элемента в конце столбца, который не является двоеточием. Или другой способ выразить это, все, что следует за последним двоеточием. Я записываю результат обратно в переменную $ column, которая создает псевдоним соответствующего элемента в @columns. Таким образом, когда я закончу, @columns хранит только мои снимки.
Наконец, после обработки двух столбцов мы локализуем $ ", присваивая ему символ табуляции. Таким образом, когда мы печатаем два столбца, заключая @columns в кавычки, интерполяция автоматически вставляет символ табуляции между столбцами снова. Если вы предпочитаете другого персонажа, теперь вы знаете, где его поменять.
Затем цикл while переходит к следующей строке. Любые пустые строки будут пропущены.
см. Perldoc open, perlretut, perlvar и perlop для объяснения трех-аргументного открытия, а также лексических файловых дескрипторов, объяснения регулярных выражений, специальных переменных Perl, таких как $ ", и того, как работает квотная интерполяция.
Хороший вопрос!