Да, pg тут же. Если Вы видите подобный код всюду по своему приложению, это означает пропавших без вести абстракции того кода. Меньше кода лучше.
Вот другая статья о предмете: http://blog.plover.com/prog/design-patterns.html
Не инициализировать $ ResultsHandle
:
use strict;
use warnings;
my $return = `dir`;
my $ResultsHandle; # <-- leave undefined
my $matchLines = "";
my $resultLine = "";
open $ResultsHandle, '<', \$return;
while (defined ($resultLine = <$ResultsHandle>)) {
if ($resultLine =~ m/joe/) {
$matchLines = $matchLines . "\t" . $resultLine;
}
}
close($ResultsHandle);
print "Original string: \n$return\n";
print "Found these matching lines: \n$matchLines\n";
Если вы оставите $ ResultsHandle
неопределенным перед open ()
, он будет заполнен ссылкой на дескриптор файла. Поскольку вы устанавливали его в строку, open ()
предполагал, что вместо этого предполагается, что это должна быть символическая ссылка на переменную --- не разрешено в , используйте strict
.
Более лаконичный способ PBP - использовать open следующим образом:
open my $ResultsHandle, '<', \$return;
Это устраняет необходимость в ранее использовавшемся "my $ Resultshandle;" объявление и позволяет избежать того строгого предупреждения, с которым вы столкнулись.
Вы также можете использовать регулярное выражение в качестве итератора:
my $data = q{Hello
This
Is
A
Test};
while( $data =~ /(.+)$/mg) {
print "line is '$1'\n";
}
Это немного менее запутано по сравнению с использованием дескриптора файла, представляющего строку.
Преобразование многострочной строки в список однострочных строк с разделением
:
my @resultLines = split /\n/, $result; # or /\r\n/ for Windows?
foreach my $resultLine (@resultLines) {
if ($resultLine =~ m/joe/) {
$matchLines
= $matchLines . "\t"
. $resultLine . "\n"; # put \n or \r\n back on the end
}
}
Откройте дескриптор файла с помощью команды pipe from "dir".
Например,
open my $FOO, "dir|" or die "Can not run 'dir': $!";
Измените
my $ResultsHandle = "";
на
my $ResultsHandle;