Обработка строк Строковой замены типа в математическом выражении

Вообразите что-то как

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

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

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

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

1
задан 10.07.2012, 22:58

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 (exp (roundn (49/200, n)), n) +roundn (exp (roundn (49/200, n)), n) *
(x-roundn (49/200, n)) +roundn (1/2, n) *roundn (exp (roundn (49/200, n)), n) *
(x-roundn (49/200, n)) ^2+roundn (1/6, n) *roundn (exp (roundn (49/200, n)), n) *
(x-roundn (49/200, n)) ^3+roundn (1/24, n) *roundn (exp (roundn (49/200, n)), n) *
(x-roundn (49/200, n)) ^4+roundn (1/120, n) *roundn (exp (roundn (49/200, n)), n) *
(x-roundn (49/200, n)) ^5+roundn (1/720, n) *roundn (exp (roundn (49/200, n)), n) *
(x-roundn (49/200, n)) ^6+roundn (1/5040, n) *roundn (exp (roundn (49/200, n)), n) *
(x-roundn (49/200, n)) ^7+roundn (1/40320, n) *roundn (exp (roundn (49/200, n)), n) *
(x-roundn (49/200, n)) ^8+roundn (1/362880, n) *roundn (exp (roundn (49/200, n)), n) *
(x-roundn (49/200, n)) ^9+roundn (1/3628800, n) *roundn (exp (roundn (49/200, n)), n) *
(x-roundn (49/200, n)) ^10+roundn (1/39916800, n) *roundn (exp (roundn (49/200, n)), n) *
(x-roundn (49/200, n) ^11

Объяснение

  • /exp\([^)]*\K\)/)$rc/g - закройте exp (), добавьте roundn близко
    • для строк, которые запускаются с "exp (" и конец с")"
    • \K делает "exp (" соответствие нулевой ширины поэтому, только закрытие paren заменяется
  • s/(?<!\^)[0-9\/*]+[0-9]/$ro\$&$rc/g - строки цифр с mult и отделением, окружите открытым roundn и roundn близко
    • строки цифр, которые не запускаются с "^", но могут содержать "/" или "*"
    • должны быть два или больше общих символа - существует, вероятно, лучший способ сделать это
    • карат отрицателен, оглядываются (нулевая ширина), таким образом, это не включено, когда замена сделана
  • s/exp\([^)]*/$ro\$&/g - откройте exp (), добавьте открытый roundn
    • прежде "exp (" сопровождаемый нулем или большим количеством символов, которые не являются")", добавляют открытый roundn
  • $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
2
ответ дан 12.12.2019, 13:04

Ну, я пытаюсь выполнить Ваш код... Я делаю небольшую программу (practicalcase1.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.

То, что я мог сделать с ошибками типа "точку с запятой, кажется..."? То, что это - supossed, я имею отношение к ошибке "Строка, нашло где оператор..."? Что относительно "Не может изменить постоянный объект в скаляре..."? Что относительно "синтаксической ошибки в practicalcase1.pl line2..."

Огромное спасибо!

0
ответ дан 12.12.2019, 13:04

Теги

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