специальные символы, вызывающие проблемы в Perl - PullRequest
0 голосов
/ 09 декабря 2010

Я хочу заменить все вхождения строки в файле следующим образом:

printf("thread %d: enters barrier at %d and leaves at %d\n", MYTHREAD, start, end);

на

printf("thread %d: enters barrier at %lf and leaves at %dlf\n", MYTHREAD, (double)start, (double)end);

КомандаЯ пытался это

perl -pi -e "s/printf(\"thread %d: enters barrier at %d and leaves at %d\\\n\", MYTHREAD, start, end);/printf(\"thread %d: enters barrier at %lf and leaves at %lf\\\n\", MYTHREAD,(double)start/CLOCKS_PER_SEC, (double)end/CLOCKS_PER_SEC)/g" bt_copy.c

Но я получаю ошибки.Кто-нибудь может указать, где я иду не так?

Ответы [ 3 ]

3 голосов
/ 09 декабря 2010

Вы используете символ косой черты / в качестве разделителя для выражения s///, но у вас также есть символ косой черты в шаблоне замены

printf(\"thread %d: enters barrier at %lf and leaves at %lf\\\n\",
MYTHREAD,(double)start/CLOCKS_PER_SEC, (double)end/CLOCKS_PER_SEC)

Вы можете попробовать использовать другой разделитель, например

perl -pi -e 's! ...pattern ... ! ...replace ...!g' input_file

(Также, если вы используете оболочку Unixy, такую ​​как bash, предпочитайте одинарные кавычки двойным кавычкам при указании однострочной программы. Таким образом, у вас будет меньше головной боли, связанной с интерполяцией метасимволов).

2 голосов
/ 09 декабря 2010

С точки зрения C, рассмотрим преимущества:

void pr_barrier_time(int thread, int start, int end)
{
     printf("thread %d enters barrier at %lf and leaves at %lf\n",
            thread, (double)start/CLOCKS_PER_SEC, (double)end/CLOCKS_PER_SEC);
}

И отредактируйте свой код так, чтобы звонки стали:

pr_barrier_time(MYTHREAD, start, end);

Вы даже можете добавить автоматический fflush () после printf () с помощью вызова функции; Гораздо сложнее делать со встроенными printf() утверждениями.

0 голосов
/ 09 декабря 2010

Это должно делать то, что вы хотите, используя sed.

sed 's/printf("thread %d: enters barrier at %d and leaves at %d\\n", MYTHREAD, start, end);/printf("thread %d: enters barrier at %lf and leaves at %dlf\\n", MYTHREAD, (double)start, (double)end);/' bt_copy.c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...