Как я могу обработать много строку строки одна строка за один раз в жемчуге с использованием, строгим на месте?

Да, pg тут же. Если Вы видите подобный код всюду по своему приложению, это означает пропавших без вести абстракции того кода. Меньше кода лучше.

Вот другая статья о предмете: http://blog.plover.com/prog/design-patterns.html

8
задан Kurt W. Leucht 18 September 2009 в 04:53
поделиться

6 ответов

Не инициализировать $ 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 .

11
ответ дан 3 November 2019 в 14:19
поделиться

Более лаконичный способ PBP - использовать open следующим образом:

open my $ResultsHandle, '<', \$return;

Это устраняет необходимость в ранее использовавшемся "my $ Resultshandle;" объявление и позволяет избежать того строгого предупреждения, с которым вы столкнулись.

7
ответ дан 3 November 2019 в 14:19
поделиться

Вы также можете использовать регулярное выражение в качестве итератора:

my $data = q{Hello
This
Is
A
Test};

while( $data =~ /(.+)$/mg) {
    print "line is '$1'\n";
}

Это немного менее запутано по сравнению с использованием дескриптора файла, представляющего строку.

4
ответ дан 3 November 2019 в 14:19
поделиться

Преобразование многострочной строки в список однострочных строк с разделением :

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
    }
}
3
ответ дан 3 November 2019 в 14:19
поделиться

Откройте дескриптор файла с помощью команды pipe from "dir".

Например,

open my $FOO, "dir|" or die "Can not run 'dir': $!";
0
ответ дан 3 November 2019 в 14:19
поделиться

Измените

my $ResultsHandle = "";

на

my $ResultsHandle;
2
ответ дан 3 November 2019 в 14:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: