Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: perl s replase не заменяет  (Прочитано 1702 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн tremor

  • Автор темы
  • Участник
  • *
  • Сообщений: 212
  • Промышляю локальными сетями
    • Просмотр профиля
    • Компьютерные сети в Екатеринбурге
perl s replase не заменяет
« : 23 Декабря 2009, 11:28:48 »
#!/usr/bin/perl -w
open ( DOTS, "dots.svg");
my $a = "0";
my $b = "1";
my $line = "first";
while ($line = <DOTS>) {
s/bb5566/aa4400/;
if ($line =~ /path[0-9]/) {sub {s/bb5566/aa4400/}; print $b,$a;}
$a = $line;
$b = $.;
}

В этом скрипте в 7 строке и в 8 есть реплейс. ни тот ни другой не работают. Естественно из консоли седом или perl -i -pe... все работает.
в 7 строке не нужен по логике "s" просто я уже наверняка чтобы он хоть чтото заменил - не меняет.
пишет warning'и:
...
Use of uninitialized value $_ in substitution (s///) at script.pl line 7, <DOTS> line 93.
...
Что неправда, если я знаю английский.
Кто нибудь знает как в теле программы на перле правильно осуществляется replace ?

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: perl s replase не заменяет
« Ответ #1 : 23 Декабря 2009, 12:12:20 »
Не, это правда. Оператору s/// не сказано, где работать, поэтому он работает на переменной $_. А ей на самом деле ничего не было присвоено.
Надо либо
$line=~s/bb5566/aa4400/;либо убрать $line вообще:
while (<DOTS>) {

И в строке if($line=~ ... не совсем понятно, что делается - объявляется безымянная процедура, которая никогда не вызывается.
« Последнее редактирование: 23 Декабря 2009, 12:16:25 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн tremor

  • Автор темы
  • Участник
  • *
  • Сообщений: 212
  • Промышляю локальными сетями
    • Просмотр профиля
    • Компьютерные сети в Екатеринбурге
Re: perl s replase не заменяет
« Ответ #2 : 23 Декабря 2009, 12:44:39 »
open ( DOTS, "dots.svg");
my $a = "0";
my $b = "0";
while (<DOTS>) {
if (/path[0-9]/) {s/bb5566/aa4400/; print $b,$a;}
$a = $_;
$b = $.;
}
 
Не заменяет...
Мне уж посоветовали для замены sed -i исп-ть и делать все башем )) Но все таки если вы знаете как делать, то напишите

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: perl s replase не заменяет
« Ответ #3 : 23 Декабря 2009, 12:47:06 »
А можно конкретный пример?
Пару строчек из файла dots.svg, которые должны быть обработаны, но не обрабатываются.
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн tremor

  • Автор темы
  • Участник
  • *
  • Сообщений: 212
  • Промышляю локальными сетями
    • Просмотр профиля
    • Компьютерные сети в Екатеринбурге
Re: perl s replase не заменяет
« Ответ #4 : 23 Декабря 2009, 12:50:54 »
66       style="fill:#bb5566;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
76       style="fill:#bb5566;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
86       style="fill:#bb5566;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
96       style="fill:#bb5566;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"

Это то что выводит скрипт. Номера строк это $.
Должно быть вместо bb5566 - aa4400

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: perl s replase не заменяет
« Ответ #5 : 23 Декабря 2009, 12:52:30 »
svg - это xml файл, который может состоять из одной строки (чтобы быть поменьше).
Для обработки рекомендуется его слегка разобрать - обработать - и собрать. Для ускорения процесса.
Или пользоваться парсером xml.

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: perl s replase не заменяет
« Ответ #6 : 23 Декабря 2009, 12:54:03 »
Во-первых, исходные строки где?
Откройте этот файл в vi и покажите то, что показывает vi.

Во-вторых, у меня все работает.

#!/usr/bin/perl -w
my $a = "0";
my $b = "0";
$_="path0/bb5566";
if (/path[0-9]/) {s/bb5566/aa4400/; print $b,$a;}
$a = $_;
$b = $.;

print "\n===\n";
print;
print "\na=$a\n";
print "b=$b\n";
результат:

$ ./replace.pl
00
===
path0/aa4400
a=path0/aa4400
Use of uninitialized value $b in concatenation (.) or string at ./replace.pl line 12.
b=

Ругань на последнее присваивание $b = $. - в перле нет переменной $.
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн tremor

  • Автор темы
  • Участник
  • *
  • Сообщений: 212
  • Промышляю локальными сетями
    • Просмотр профиля
    • Компьютерные сети в Екатеринбурге
Re: perl s replase не заменяет
« Ответ #7 : 23 Декабря 2009, 12:54:19 »
    <path
       sodipodi:type="arc"
       style="fill:#bb5566;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
       id="path03"
       sodipodi:cx="75.535713"
       sodipodi:cy="58.75"
       sodipodi:rx="29.464285"
       sodipodi:ry="25.535715"
       d="M 105,58.75 A 29.464285,25.535715 0 1 1 46.071428,58.75 A 29.464285,25.535715 0 1 1 105,58.75 z"
       transform="matrix(1.0860606,0,0,1.2531468,-34.179219,61.377625)" />
    <path
       sodipodi:type="arc"
       style="fill:#bb5566;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
       id="path04"
       sodipodi:cx="75.535713"
       sodipodi:cy="58.75"
       sodipodi:rx="29.464285"
       sodipodi:ry="25.535715"
       d="M 105,58.75 A 29.464285,25.535715 0 1 1 46.071428,58.75 A 29.464285,25.535715 0 1 1 105,58.75 z"
       transform="matrix(1.0860606,0,0,1.2531468,60.463638,61.020482)" />

Это если cat'ом
path и fill точно в разных строках.

Пользователь решил продолжить мысль 23 Декабря 2009, 12:55:28:
$. это номер строки. переменная есть и вывод присутствует. сейчас без нее попробую.

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: perl s replase не заменяет
« Ответ #8 : 23 Декабря 2009, 12:56:26 »
Все правильно, там же стоит if(/path[0-9]/)
if не отрабатывает, замена не происходит.
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн tremor

  • Автор темы
  • Участник
  • *
  • Сообщений: 212
  • Промышляю локальными сетями
    • Просмотр профиля
    • Компьютерные сети в Екатеринбурге
Re: perl s replase не заменяет
« Ответ #9 : 23 Декабря 2009, 12:57:13 »
Ругань на последнее присваивание $b = $. - в перле нет переменной $.
[/quote]

12 строка - это уже ваше. у меня присваивание в 8ой

Пользователь решил продолжить мысль 23 Декабря 2009, 12:58:03:
Все правильно, там же стоит if(/path[0-9]/)
if не отрабатывает, замена не происходит.

Точно, а как заменить предыдущую строку тогда, вот я дал то ))

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: perl s replase не заменяет
« Ответ #10 : 23 Декабря 2009, 12:58:58 »
Точно, а как заменить предыдущую строку тогда, вот я дал то ))
Запоминать ее.
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн tremor

  • Автор темы
  • Участник
  • *
  • Сообщений: 212
  • Промышляю локальными сетями
    • Просмотр профиля
    • Компьютерные сети в Екатеринбурге
Re: perl s replase не заменяет
« Ответ #11 : 23 Декабря 2009, 13:02:08 »
Ну я ее запоминаю в переменной. а как ее потом изменить? Можно пример, не совсем понимаю. типа так: $a=~s/ddd/fff/;
и он в файле поменяет?

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: perl s replase не заменяет
« Ответ #12 : 23 Декабря 2009, 13:09:10 »
Ну я ее запоминаю в переменной. а как ее потом изменить? Можно пример, не совсем понимаю.
типа так: $a=~s/ddd/fff/;
Так. Можно еще в конце флагов добавит, типа gi. В документации все написано.
$a=~s/ddd/fff/gi;
и он в файле поменяет?
;D Нет, конечно, только в памяти
« Последнее редактирование: 23 Декабря 2009, 13:11:13 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн tremor

  • Автор темы
  • Участник
  • *
  • Сообщений: 212
  • Промышляю локальными сетями
    • Просмотр профиля
    • Компьютерные сети в Екатеринбурге
Re: perl s replase не заменяет
« Ответ #13 : 23 Декабря 2009, 13:11:06 »
А мне надо файл. В памяти то не проблема поменять.
gi не надо мне

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: perl s replase не заменяет
« Ответ #14 : 23 Декабря 2009, 13:13:43 »
Так надо туда явно писать :)

OUT=open(">file") or die("cannot open");

while(<DOTS>) {
  [цикл чтения и обработки]
  [тра-ля-ля]
  print OUT $a;
}
close(OUT)
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

 

Страница сгенерирована за 0.023 секунд. Запросов: 21.