1

Представь что-то вроде

exp(49/200)+(x-49/200)

Я хочу передать в качестве аргумента функции "roundn" любую операцию, которая не является сложением или вычитанием. Так что мое выражение стало

roundn(exp(roundn(49/200,n)),n)+(x - roundn(49/200,n)

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

exp(49/200)+exp(49/200)*(x-49/200)+1/2*exp(49/200)*(x-49/200)^2+1/6*exp(49/200)*(x-       49/200)^3+1/24*exp(49/200)*(x-49/200)^4+1/120*exp(49/200)*(x-49/200)^5+1/720*exp(49/200)*(x-49/200)^6+1/5040*exp(49/200)*(x-49/200)^7+1/40320*exp(49/200)*(x-49/200)^8+1/362880*exp(49/200)*(x-49/200)^9+1/3628800*exp(49/200)*(x-49/200)^10+1/39916800*exp(49/200)*(x-49/200)^11

Я ищу метод (который включает в себя любую программу), не основанный на языковом программировании, а как много пакетных или подобных ...

2 ответа2

2

Попробуй это:

ro='roundn('    # roundn open
rc=',n)'        # roundn close
fun='exp\('
expression='exp(49/200)+(x-49/200)'
echo "$expression" |
perl -pe "s/$fun[^)]*\K\)/)$rc/g; s/(?<!\^)[0-9\/*]+[0-9]/$ro\$&$rc/g; s/$fun[^)]*/$ro\$&/g"

который должен дать вам:

roundn(exp(roundn(49/200,n)),n)+(x-roundn(49/200,n))

Ваше более длинное выражение должно привести к:

roundn(ехр (roundn (49/200, п)), п)+roundn (ехр (roundn (49/200, п)), п)*
(Х-roundn (49/200, п))+roundn (1/2, п)* roundn (ехр (roundn (49/200, п)), п)*
(Х-roundn (49/200, п))^ 2+roundn (1/6, п)* roundn (ехр (roundn (49/200, п)), п)*
(Х-roundn (49/200, п))^ 3+roundn (1/24, п)* roundn (ехр (roundn (49/200, п)), п)*
(Х-roundn (49/200, п))^ 4+roundn (1/120, п)* roundn (ехр (roundn (49/200, п)), п)*
(Х-roundn (49/200, п))^ 5+roundn (1/720, п)* roundn (ехр (roundn (49/200, п)), п)*
(Х-roundn (49/200, п))^ 6+roundn (1/5040, п)* roundn (ехр (roundn (49/200, п)), п)*
(Х-roundn (49/200, п))^ 7+roundn (1/40320, п)* roundn (ехр (roundn (49/200, п)), п)*
(Х-roundn (49/200, п))^ 8+roundn (1/362880, п)* roundn (ехр (roundn (49/200, п)), п)*
(Х-roundn (49/200, п))^ 9+roundn (1/3628800, п)* roundn (ехр (roundn (49/200, п)), п)*
(Х-roundn (49/200, п))^ 10+roundn (1/39916800, п)* roundn (ехр (roundn (49/200, п)), п)*
(x-roundn (49/200, n)^ 11

объяснение

  • /exp\([^)]*\K\)/)$rc/g - закрыть exp(), добавить округлить закрыть
    • для строк, которые начинаются с "exp(" и заканчиваются на ")"
    • \K делает "exp(" совпадением нулевой ширины, поэтому заменяется только закрывающая пара
  • s/(?<!\^)[0-9\/*]+[0-9]/$ro\$&$rc/g - цепочки цифр с множеством и делением, окружены округленным открытием и округленным закрытием
    • строки цифр, которые не начинаются с «^», но могут содержать «/» или «*»
    • должно быть всего два или более символов - возможно, есть лучший способ сделать это
    • Карат имеет отрицательный взгляд сзади (нулевой ширины), поэтому он не включен, когда замена сделана
  • s/exp\([^)]*/$ro\$&/g - открыть exp(), добавить круглое открытие
    • перед выражением "exp(", за которым следует ноль или более символов, которые не являются ")", добавьте круглое открытое
  • $ro , $rc и $fun являются переменными оболочки
    • обертывание скрипта Perl в двойные кавычки позволяет расширить эти переменные
  • $& содержит полное совпадение, кроме частей с нулевой шириной
    • выходить из него, вероятно, не нужно, но я сделал это на всякий случай - чтобы не перепутать оболочку

Было бы не сложно сделать эту работу, если есть более одной функции. Однако, вероятно, он полностью развалится, если они будут вложенными.

Редактировать:

Вот версия сценария Perl:

$ro = "roundn(";
$rc = ",n)";
$fun = "exp\\(";
while (<>) {
    s/$fun[^)]*\K\)/)$rc/g;
    s/(?<!\^)[0-9\/*]+[0-9]/$ro$&$rc/g;
    s/$fun[^)]*/$ro$&/g;
    print
}

Запустите это так:

perl script.pl < data.txt
0

Ну, я пытаюсь выполнить твой код ... Я делаю небольшую программу (практический случай1.pl) с первым абзацем кода, который вы написали:

ro='roundn('    # roundn open
rc=',n)'        # roundn close
fun='exp\('
expression='exp(49/200)+(x-49/200)'
echo "$expression" |
perl -pe "s/$fun[^)]*\K\)/)$rc/g; s/(?<!\^)[0-9\/*]+[0-9]/$ro\$&$rc/g; s/$fun[^)]*/$ro\$&/g"

Но я получаю некоторые сообщения на cmd окон:

Semicolon seems to be missing at practicalcase1.pl line 1
Semicolon seems to be missing at practicalcase1.pl line 2
Semicolon seems to be missing at practicalcase1.pl line 3
Semicolon seems to be missing at practicalcase1.pl line 4
String found where operator expected at practicalcase1.pl line 5, near "echo "$expression""
(Do you need to predeclare echo?)
String found where operator expected at practicalcase1.pl line 6, near "pe "s/$fun[^)]*\K\)/)$rc/g; s/(?<!\^)[0-9\/*]+[0-9]/$ro\$&$rc/g""
(Do you need to predeclare pe?)
Can´t modify constant item in scalar assigment at practicalcase1.pl line 2, near "rc"
syntax error at practicalcase1.pl line 2, near "rc"
Execution of practicalcase1.pl aborted due to compilation errors.

Что я мог сделать с ошибками типа "точка с запятой, кажется ..."? Что это значит, что я должен сделать с ошибкой «Строка найдена, где оператор ...»? А как насчет "Не могу изменить константу в скаляре ..."? А как насчет "синтаксической ошибки на практическом case1.pl line2 ..."

Спасибо вам большое!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .