我有一个很长的正则表达式,可以将文本文件解析为各种匹配变量.
对于稳健性,匹配变量可能包含空格.我想通过迭代匹配变量以系统的方式删除空格.
例如,我有比赛的变量$2通过$14包含一些空白.
我可以:
my @columns = my ($serNum, $helixID, $initResName, $initChainID,
$initSeqNum, $initIcode, $endResName, $endChainID, $endSeqNum,
$endICode, $helixClass, $comment, $length) =
($2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14);
### Remove whitespace
foreach my $element (0..$#columns) {
$columns[$element] =~ s/^\s+//;
$columns[$element] =~ s/\s+$//;
}
Run Code Online (Sandbox Code Playgroud)
但是,这不仅能消除在元素的空白@column,并留下正确命名标量,$serNum,$helixID,等不变.
有没有办法在将每个匹配变量复制到更好命名的标量之前删除每个匹配变量中的空白区域,或者有没有办法迭代这些命名良好的标量本身并从那里删除空格?
我认为可能有一些方法可以用引用来做到这一点.
在进行简单的编程练习时,我创建了一个while循环(Fortran中的DO循环),当一个实变量达到精确值时,它就会退出.
我注意到由于使用的精度,从未满足相等性并且循环变得无限.当然,这并不是闻所未闻的,并且建议不要将两个数字进行相等比较,最好看两个数字之间的绝对差值是否小于设定的阈值.
我发现令人失望的是我必须设置这个阈值,即使变量是双精度,我的循环也能正常退出.此外,当我在Perl中重写了这个循环的"蒸馏"版本时,我没有数值精度的问题,并且循环退出很好.
由于产生问题的代码非常小,在Perl和Fortran中,我想在这里重现它,以防我对一个重要的细节进行掩饰:
Fortran代码
PROGRAM precision_test
IMPLICIT NONE
! Data Dictionary
INTEGER :: count = 0 ! Number of times the loop has iterated
REAL(KIND=8) :: velocity
REAL(KIND=8), PARAMETER :: MACH_2_METERS_PER_SEC = 340.0
velocity = 0.5 * MACH_2_METERS_PER_SEC ! Initial Velocity
DO
WRITE (*, 300) velocity
300 FORMAT (F20.8)
IF (count == 50) EXIT
IF (velocity == 5.0 * MACH_2_METERS_PER_SEC) EXIT
! IF (abs(velocity - (5.0 * MACH_2_METERS_PER_SEC)) < 1E-4) EXIT
velocity = velocity + 0.1 * MACH_2_METERS_PER_SEC
count …Run Code Online (Sandbox Code Playgroud) 我有一个perl脚本,它准备文件以输入二进制程序,并将二进制程序的执行提交给SGE排队系统版本6.2u2.
提交的作业带有-sync y允许父perl脚本使用waitpid函数监视已提交作业状态的选项.
这也非常有用,因为将SIGTERM发送到父perl脚本会将此信号传播给每个子节点,然后将这些信号转发到qsub,从而优雅地终止所有关联的已提交作业.
因此,能够使用此-sync y选项提交作业至关重要.
不幸的是,我一直收到以下错误:
Unable to initialize environment because of error: range_list containes no elements
请注意"容器"的拼写错误.那不是拼写错误.它只是向您展示了代码/错误消息的这个区域必须维护得多么糟糕.
产生这种错误的尝试失败提交甚至产生输出和错误文件*.e{JOBID}和*.o{JOBID}.提交完全失败了.
搜索谷歌此错误消息只会导致隐藏的留言板上的未解决的帖子.
甚至不能可靠地发生此错误.我可以重新运行我的脚本,相同的工作甚至不一定会产生错误.我尝试提交作业的节点似乎也无关紧要.
我希望有人可以解决这个问题.
因此,任何这些问题的答案都可以解决我的问题:
我有两个git repos,它们是彼此的分叉,我需要偶尔将提交从一个提交到另一个.
例如:
git-repo1 有这个目录结构:
repo1/project1/src
repo1/project2/src
while git-repo2具有以下目录结构:
repo2/src/
我想要做的是进行一系列提交并仅为改变特定子目录(例如repo1/project1/src)中的文件的提交生成补丁,并忽略所有仅在其他地方改变文件的提交.
或者,为所有提交生成修补程序,但仅在应用程序修改特定目录中的文件时应用修补程序.
我需要保留有关提交的元数据,因此使用git diff它似乎不是一个可行的选项.
forked git repos之间的目录结构不同.
有没有直接的方法来做到这一点?
UPDATE1
在处理不同的目录结构方面,我看到了这个问题(如何将git补丁从一个存储库应用到另一个存储库?)
但是,如果修补程序谈到修改根本不存在的文件会怎么样?我想忽略这些变化.
我有一个内存泄漏的脚本.我相信这是因为我undef在我的嵌套对象上执行后,脚本中的内存量保持不变.我已经使用Devel :: Cycle来定位任何循环引用,并且我将这些循环引用转换为弱引用Scalar::Util.问题仍然存在.
现在我试图用Valgrind来解决这个问题.作为valgrind的第一个开始,我测试了一个perl hello world程序:
#! /usr/bin/perl
use strict;
use warnings;
print "Hello world!\n";
Run Code Online (Sandbox Code Playgroud)
这是运行时的valgrind输出valgrind --trace-children=yes perl ./hello_world.pl:
==12823== HEAP SUMMARY:
==12823== in use at exit: 290,774 bytes in 2,372 blocks
==12823== total heap usage: 5,159 allocs, 2,787 frees, 478,873 bytes allocated
==12823==
==12823== LEAK SUMMARY:
==12823== definitely lost: 13,981 bytes in 18 blocks
==12823== indirectly lost: 276,793 bytes in 2,354 blocks
==12823== possibly lost: 0 bytes in 0 blocks
==12823== …Run Code Online (Sandbox Code Playgroud) 我想以screen分离状态启动会话,以便它们在脚本完成后终止,这样我就可以编写一个脚本来执行多个screen会话,而无需手动逐一启动每个会话,然后分离,然后再继续到下一个屏幕会话。
该脚本取决于设置的某些环境变量。通常,当我screen在常规bashshell 之外运行此脚本时,我只需在我的文件中设置这些环境变量即可.bash_profile。
此外,当我以非分离状态启动屏幕并放入我的.screenrc文件时:
shell -$SHELL
那么我也没有问题。
仅当我执行时才会出现问题,screen -dm然后由于未设置我需要的环境,我的脚本无法运行。
在分离状态下启动时,如何告诉屏幕引用该.screenrc文件,以便它最终.bash_profile在启动时获取我的文件?
更新
当我执行时screen -dmL env,我可以看到一些但不是全部的环境变量都存在。
我需要在可变数量的数据上计时函数的执行时间。
def foo(raw_data):
preprocessed_data = preprocess_data(raw_data)
time = timeit.Timer('module.expensive_func(preprocessed_data)', 'import module').timeit()
Run Code Online (Sandbox Code Playgroud)
但是,preprocessed_data不是全局变量。无法使用导入from __main__。它在此子例程中是本地的。
如何导入data到timeit.Timer环境中?
除非我弄错了,否则Fortran无法用任意数量的参数编写函数或子例程(更简洁地称为可变参数函数).
例如:
RESULT = FUNC(A1, A2 [, A3 [, ...]])
我知道,我可以创建可选参数,但参数的数量是有限的,必须在函数定义中逐个手动声明.
那么Fortran编译器如何实现,MAX或者MIN实际上是
RESULT = MAX(A1, A2 [, A3 [, ...]])
特别令人困惑的是,这些可变参数MAX和MIN函数显然是Fortran 77标准的一部分.因此,实现这些功能的任何能力都必须在1977年左右提供.
我想找出两个日期之间在主分支(或与此相关的任何一个分支)上修改的所有文件。
我明白,从这篇文章(如何仅列出两次提交之间更改的文件名?)我可以使用
git diff --name-only SHA1 SHA2
但我不知道今天和昨天之间的 SHA 是什么。特别是当一天可能有多个提交时。
更准确地说,我想知道今天凌晨 12:01 到昨天凌晨 12:01 之间主 git 存储库上更改的文件列表。
这可能吗?我以前可以在 CVS 中使用cvs diff -D "1 days ago".