使用“strict subs”时不允许使用裸词

Posted

技术标签:

【中文标题】使用“strict subs”时不允许使用裸词【英文标题】:Bareword not allowed while "strict subs" in use 【发布时间】:2019-01-17 14:49:03 【问题描述】:

我是一名高阻隔橡胶材料的研究员。通过使用 Materials Studo 软件,我遇到了 Perl 的一些问题。我无法理解 Perl 错误的含义。

这是 Perl 脚本及其错误

#!perl

use strict;

use Getopt::Long;
use MaterialsScript qw(:all);

for ( my $RxnRadius = my $MinRxnRadius; $RxnRadius <= my $MaxRxnRadius; $RxnRadius += 0.5 ) 

    my $xsdNameDist = sprintf( "%s_R%.2f", my $rootName, $RxnRadius );    #rename the new structure;

    if ( $RxnRadius > $MinRxnRadius ) 

        my $doc->Name = $xsdNameDist . "_init";
        ForciteGeomOpt( $doc, 20000 );                                    # run 20000 steps of Geometry Optimization

        my $results = ForciteDynamics( $doc, my $steps, "NPT" );
        $results->Trajectory->Delete;
    

    for ( my $iteration = 1; $iteration <= my $IterationsPerRadius; $iteration++ ) 

        my $doc->Name = $xsdNameDist . "_" . $iteration;
        my $numBonds = createNewXlinks( $doc, $RxnRadius );
        my $reactedOligomerAtoms = 0;

        foreach my $atom ( @ $doc->UnitCell->Atoms  ) 
            my $oligomerReactiveAtom;
            $reactedOligomerAtoms++ if ( $atom->Name =~ /^$oligomerReactiveAtom-\d/ );
        

        my $conversion = 100 * my $totalOligomerAtoms;

        ( $reactedOligomerAtoms / $totalOligomerAtoms );

        if ( $numBonds == 0 ) 
            last;
        

        optimizeAndPerturb( $doc );

        my $rowCounter;
        xlinkStatistics( $doc, $RxnRadius, $rowCounter );
        maxBondEnergy( $doc, $RxnRadius, $rowCounter ) if ( my $UseMaxBondEnergy );

        my $analysis_doc = Documents->New( "analyze.xsd" );
        $analysis_doc->CopyFrom( $doc );

        my $analyzeDuration;
        my $timeStep;

        my $steps   = ( $analyzeDuration * PICO_TO_FEMTO / $timeStep );
        my $freq    = int( $steps / 20 ); ### line 56
        my $results = Forcite Dynamics(
            $analysis_doc, $steps,
            "NPT",
            ( TrajectoryFrequency => $freq )
        );

        getTrajTempAndPressure( $results, $rowCounter, $RxnRadius );
        getEnergies( $results, $rowCounter );
        $analysis_doc->Delete;
        $results->Trajectory->Delete;

        if ( $conversion >= my $conversionTarget ) 

            my $numbondsDelete = my $xlinkCounter - $reactedOligomerAtoms - my $targetOligomerAtoms;

            if ( my $deleteExcessXlinks and $numbondsDelete > 0 ) 
                deleteExcessBonds( $doc, $numbondsDelete );
                xlink Statistics( $doc, "Final", $rowCounter );
            
            else 
                my $textDoc->Append(
                    sprintf "There  are no excess bonds to delete\n "
                );
            

            my $textDoc->Save;

            last;
        

        Documents->SaveAll;
    

    last if ( my $conversion >= my $conversionTarget );


my $doc->Name = my $rootName . "_final";
analyzeBonds( $doc );
XlinkSet( $doc );
Glasstransitiontemperature( $doc );
Documents->SaveAll;

给予

在 -e 第 56 行“PICO_TO_FEMTO”。 -e 有编译错误。

我不知道如何理解通知或如何解决问题。

【问题讨论】:

欢迎来到 Stack Overflow。请尽快阅读 About 和 How to Ask 页面,但更重要的是,请阅读有关如何创建 MCVE (minimal reproducible example) 的信息。第 56 行的错误表明您在最小化代码方面做得还不够。裸词是前面带有$(或@% 或...)之类的符号的标识符。您确定以下行:my $steps = ($analyzeDuration * PICO_TO_FEMTO / $timeStep); ***-----line 56***(最好将标记变成 Perl 注释),并且PICO_TO_FEMTO 前面没有$MaterialsScript 是公共可用模块吗? 有时,您可以使用裸词作为常量:例如use constant PICO_TO_FEMTO =&gt; 1.0E6;(或者是1.0E-6? - 它只是万亿的因子,因此您应该能够推断出哪个是正确的)。然后你可以写my $fm = PICO_TO_FEMTO * $pm;$pm中的皮米转换成$fm中对应的飞米数。 所以你需要一个use constant PICO_TO_FEMTO =&gt; 1E-03;。这可以在您显示的文件中给出,或者在 use-ed 的自定义模块中给出,该模块位于文件 MaterialsScript.pm 中。如果它打算在该模块中,qw(:all) 表示它将根据需要导出。因此,从您所展示的内容中尚不清楚为什么它不存在。或者也许......常量是在另一个模块中定义的,应该包含但不是? constant 是一个编译指示,它定义了常量子例程,因此它们可以用作“裸词”,即没有前导符号($@%),其中 Perl变量必须有。因为在你的情况下,这显然还没有完成,口译员抱怨一句空话。 我不经常使用低于 pico (10⁻¹²) 的单位,并认为 femto 是 10⁻¹⁸,但那是 'atto' 而 femto 实际上是 10⁻¹⁵,所以我离开了两者之间的转换系数为 1000。呃,好吧! (Perl 语法是有效的。) 【参考方案1】:

可能某种形式的PICO_TO_FEMTO 是从MaterialsScript 库中导入的,因为它没有在您的脚本中定义。

看看这个库。我的假设是,它的名字实际上是$PICO_TO_FEMTO,一个带有$ sigil 的简单标量变量。

Perl 中的裸词是没有符号的标识符。如果它是一个函数,那没关系。但这可能是一个变量。

如果你想定义一个裸字变量,你可以这样做:

use constant PICO_TO_FEMTO => 1000;

这会创建一个名为 PICO_TO_FEMTO 的函数,它在后台总是返回 1000。

【讨论】:

以上是关于使用“strict subs”时不允许使用裸词的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Perl 中使用布尔变量?

在 Perl 中使用裸词都有哪些陷阱?

Perl:lib Net::SSH::Expect 中的裸词“exp_continue”

Spring:文件上传时不允许使用方法

Laravel 错误 - 更新时不允许发布方法(使用 @method('put))

执行 AJAX POST 时不允许使用的关键字符 [重复]