何时使用 def - Groovy Shell

when to use def - groovy shell

提问人:Death Metal 提问时间:8/1/2023 最后编辑:aakash250798Death Metal 更新时间:8/2/2023 访问量:70

问:

我是 nextflow 的新手,它大量使用 groovy。我正在学习时髦来学习闭包,以便可以在 nextflow 中学习和实现。我有一小段代码,我正在尝试打印并在时髦的 shell 中执行。

f_name="MM-265-DNA-T-01-01_L003_R1_001.fastq.gz"
matcher = f_name =~ /^(MM-\w+)-DNA-(\w+)-.*_L(\d+).*$/
def (_, sample_id, sample_type, lane) = matcher[0].findAll()

当我尝试打印无法打印并给我错误
sample_type时,我尝试了以下方法来打印示例 ID,但失败了:
sample_idUnknown property: sample_id

“${sample_id}” “$sample_id”

${sample_id}
$sample_id

如果我使用,代码可以正常工作,但为什么它不适用于?
我从我的另一篇帖子中得到这个 https://bioinformatics.stackexchange.com/a/21339/862
(_, sample_id, sample_type, lane) = matcher[0].findAll()def

Groovy 闭包 NextFlow

评论

2赞 daggett 8/1/2023
在普通中,Groovy 脚本声明 Script/Function/Scope 的局部变量,如果没有 Groovy 时,会创建在整个脚本中可见的变量(属性)。我不熟悉 Nextflow,但它真的很重要,你在哪里声明变量以及在哪里使用它 - 它必须是相同的范围。defdefdef
2赞 mribeirodantas 8/1/2023
您共享的代码在这里工作得很好,使用 Nextflow 23.06.0-edge。
0赞 Death Metal 8/2/2023
@mribeirodantas 嗨,是的,它可能在 nexflow 中工作正常,但是我正在尝试在 groovyshell 中。一个小问题 - 有下一个流吗?shell
1赞 mribeirodantas 8/2/2023
好吧,让我们澄清一点:Nextflow 是一种建立在 Groovy 之上的语言。它不是 Groovy,因此在 Groovy shell 中运行 Nextflow 代码应该不起作用,根据设计😅,您可以尝试(这是一个命令)。nextflow console

答:

2赞 Steve 8/1/2023 #1

您的 Groovy 代码本身没问题,但是如果将该代码移动到工作流块中,Nextflow 将引发错误。我有时会看到这样的错误,这可能是这里的问题:

ERROR ~ Script compilation error
- file : main.nf
- cause: Variable `matcher` already defined in the process scope @ line X, column Y.

我们可以将示例简化为:

workflow {

    foo = 'foooooooo'

    def bar = foo
}

结果:

ERROR ~ Script compilation error
- file : main.nf
- cause: Variable `foo` already defined in the process scope @ line 5, column 15.

我认为这与 Nextflow 如何跟踪(内部)全局变量1 的使用有关。这个错误是相当出乎意料的,但至于它是否是一个错误或功能,对于Nextflow开发人员来说将是一个问题。目前尚不清楚(至少对我而言)是否应该将赋值运算符右侧的变量添加到引用变量集中。

无论如何,解决方案是首选使用关键字的局部变量:def

workflow {
    
    def f_name = "MM-265-DNA-T-01-01_L003_R1_001.fastq.gz"
    def matcher = f_name =~ /^(MM-\w+)-DNA-(\w+)-.*_L(\d+).*$/
    
    def (_, sample_id, sample_type, lane) = matcher[0].findAll()

    println(sample_id)
    println(sample_type)
    println(lane)
}

结果:

MM-265
T
003

评论

0赞 Death Metal 8/1/2023
嗨,@Steve,一如既往地感谢。但是,在从正则表达式捕获输出时,我能够打印,在时髦的外壳中没有并且不起作用。_, sample_id, lane, sample_typedef
1赞 Steve 8/2/2023
完全不用担心@DeathMetal。如果仍有问题,请发布无法产生预期结果的完整代码。您提供的代码将在 Groovy shell 中运行,并按预期解压缩匹配的输出。我以为我可能已经猜到了问题所在,但看起来我错了。