Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Регулярные выражения > Использование $& для получения результата


Автор: FiMa1 11.1.2010, 19:01
Ребята, привет всем!

Мне нужна ваша помощь в очень простом вопросе.

Есть содержимое файла:
Код

string1
  string2
string3

Есть скрипт, работающий с этим файлом:
Код

if(scalar(@ARGV) == 0) {
    print "None of file paths is specified!";
    exit;
}
# for all the specified files
for ($i = 0; $i < @ARGV; $i++) {
    $file_path = $ARGV[$i];
    open(IN, $file_path) || die; # read next file
    while ($line = <IN>) {
        $line =~ m/^[^\s].+$/;
        print $& . "\n";
     }
     close (IN);
}

Соответственно, после выполнения скрипта я ожидаю вывод:
Код

string1
string3

Вместо этого получаю
Код

string1
string1
string3

Так как во втором проходе условие регулярного выражения не выполняется, то переменная $& сохраняет свое значение от предыдущего прохода ("string1"), что и выводится на печать.

Вопрос: как правильно поступать в подобных случаях? Очистить содержимое переменной $& невозможно, она readonly. Подскажите, пожалуйста, никак не могу найти этого в справочниках.

Автор: ming 11.1.2010, 21:02
оператор =~ возвращает 1 (истину) если строка совпала с шаблоном:

Код

while ($line = <IN>) {
        if ($line =~ m/^[^\s].+$/) {
                print $& . "\n";
        }
}

Автор: FiMa1 11.1.2010, 21:58
Цитата(ming @ 11.1.2010,  21:02)
оператор =~ возвращает 1 (истину) если строка совпала с шаблоном

Круто! ming, спасибо за помощь! Похоже то, что нужно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)