【发布时间】:2013-02-28 00:05:30
【问题描述】:
为了提高 FORTRAN 代码的性能,我想置换数组的索引,以便将第 4 个索引移动到第二位,例如,我想更改以下行
ts(l,i,j,k) = ts(l,i,j,k1(i,j))
到
ts(l,k,i,j) = ts(l,k1(i,j),i,j)
请注意,这只是一个示例行,索引并不总是称为 i,j,k,l... 我只知道数组的名称和等级。所以我不能只用逗号分隔 4 个参数,因为一个参数也可以是一个带有逗号的矩阵(在上述情况下为 k1(i,j))。所以我的第一个想法
sed -r 's/ts\(([^,]+),([^,]+),([^)]+),([^,]+)\)/ts\(\1,\4,\2,\3\)/g' *.F
在这种情况下失败(上面代码行中的 rhs),因为它给出了:
ts(l,k,i,j) = ts(l,j),i,j,k1(i)
我需要的是一个正则表达式,它仅在打开最多 1 个括号时才拆分我的数组索引。有人可以给我一个提示如何使用 sed/python/perl 做到这一点吗?
祝你好运
【问题讨论】:
-
你确定括号永远不会嵌套得比这更深吗?
-
您确定这会提高您的表现吗?如果您的循环以正确的顺序编写,我预计性能会因此下降。 (当然,只要您将旧版本签入您的 VCS,就可以进行实验并查看)
-
现在,
fortran并不是全部大写 :) -
@Tim 是的,我认为它不会更深入......如果有 1-2 个例外,我会很乐意手动修复这些行。
-
@mgilson 不是我不确定,但如果有帮助我想试试。