我的理解是,为了从作为参数传递到子例程的文件中获取日期,必须将该参数重新设置为子例程中的变量.它是否正确?这对我来说没有,所以我想知道我是不是完全明白发生了什么.除了日期提取之外,我几乎可以在任何其他子例程代码中使用传入的参数.
set setupEXE=setup.exe
CALL :SUB_CheckCorrectDate %setupEXE%
GOTO EOF
::----------------------------------
:SUB_CheckCorrectDate
set filename=%1%
:: SUCCESSFUL
for %%x in (%filename%) do set FileDate=%%~tx
@For /F "tokens=1-3 delims=-/ " %%A in ('@echo %FileDate%') do @( 
Set file_Month=%%A
Set file_Day=%%B
Set file_Year=%%C
)
:: GET ERROR    
for %%x in (%1%) do set FileDate=%%~tx
@For /F "tokens=1-3 delims=-/ " %%A in ('@echo %FileDate%') do @( 
Set file_Month=%%A
Set file_Day=%%B
Set file_Year=%%C
)    
GOTO:EOF
:: ------------------
:EOF
我正在创建一个简单的模板文件,这将有助于创建未来的脚本,以便通过*nix系统上的命令行执行各种任务.作为其中的一部分,我可能要求用户输入需要根据源代码中提供的正则表达式进行验证的数据.
当我尝试通过命令行运行Perl代码时,会开始生成错误.我试图将正则表达式传递给repeat子例程,我不确定如何正确执行此操作.我知道我可以使用eval执行一个字符串,但是由于约定,这是我想要避免的.
Use of uninitialized value $_ in pattern match (m//) at scripts/template line 40.
Use of uninitialized value $resp in concatenation (.) or string at scripts/template line 37.
#!/usr/bin/env perl
use strict;
use warnings;
use Cwd;
use Term::ANSIColor;
use Data::Dumper;
my $log = "template.log";
my $task = "template";
my $cwd = getcwd();
my $logPath = $cwd . "/". $log;
print ucfirst($task) . " utility starting...\n";
system("cd ~/Desktop");
system("touch " . $log);
&writeLog("Test");
sub …似乎 aasub在映射内部使用时无法访问动态变量并且该映射被“返回”。
考虑这段代码:
sub start {
    my $*something = 'foobar';
    
    # WORKS
    say 'first say-something:';
    say-something;
    
    # WORKS
    say 'mapped say-something, no return:';
    my @foo = (^2).map({say-something});
    
    # ERROR: Dynamic variable $*something not found
    say 'mapped say-something, with return:';
    return (^2).map({say-something});
}
sub say-something {
    say $*something;
    1
}
start;
这将输出:
first say-something:
foobar
mapped say-something, no return:
foobar
foobar
mapped say-something, with return:
Dynamic variable $*something not found
  in sub say-something at main.raku line 18
  in block …我发现在Perl子程序中使用标签,从多个循环中断,或者用更新的变量重做某些部分,非常有帮助.社区如何看待这种编码风格?在子程序中使用标签不受欢迎吗?
经过多次痛苦的调试后,我相信我已经找到了Fortran的一个独特属性,我想在stackoverflow验证这里.
我一直注意到的是,至少,内部逻辑变量的值在函数或子程序调用中保留.
这是一些示例代码来说明我的观点:
PROGRAM function_variable_preserve
IMPLICIT NONE
CHARACTER(len=8) :: func_negative_or_not ! Declares function name
INTEGER :: input
CHARACTER(len=8) :: output
input = -9
output = func_negative_or_not(input)
WRITE(*,10) input, " is ", output
10 FORMAT("FUNCTION: ", I2, 2A)
CALL sub_negative_or_not(input, output)
WRITE(*,20) input, " is ", output
20 FORMAT("SUBROUTINE: ", I2, 2A)
WRITE(*,*) 'Expected negative.'
input = 7
output = func_negative_or_not(output)
WRITE(*,10) input, " is ", output
CALL sub_negative_or_not(input, output)
WRITE(*,20) input, " is ", output
WRITE(*,*) 'Expected positive.'
END PROGRAM …我正在阅读代码完成2,其中一个要点是关于创建子程序,即使对于看起来太简单而无法拥有自己的子程序的操作,以及它如何有用.
我知道我可以使用关键字在C和C++中内联函数inline.但我从未想过在Perl中内联子程序的方法.
有没有办法告诉Perl解释器内联子程序调用(或为什么不)?
我无法理解哈希引用并更改哈希值,而不是返回它.我想编写一个子例程,它将从哈希返回一个值并修改哈希值.在编写代码时我遇到了一些问题.所以,我编写了以下基本代码来理解修改哈希的位置.
#!/usr/local/bin/perl
#Check hash and array references
#Author: Sidartha Karna
use warnings;
use strict;
use Data::Dumper;
sub checkHashRef{
   my ($hashRef, $arrVal) = @_;
   my %hashDeref = %{$hashRef};
   $hashDeref{'check'} = 2;           
   push(@{$arrVal}, 3);
   print "There:" ;
   print Dumper $hashRef;      
   print Dumper %hashDeref;           
   print Dumper $arrVal
}
my %hashVal = ('check', 1);
my @arrVal = (1, 2);
checkHashRef(\%hashVal, \@arrVal);
print "here\n";
print Dumper %hashVal;
print Dumper @arrVal;
观察到的输出是:
    There:$VAR1 = {
          'check' => 1
        };
    $VAR1 = 'check';
    $VAR2 = 2;
    $VAR1 …我对在模块中使用接口块以及使用CONTAINS语句为模块内部的过程创建"显式接口"感到困惑.
我通常使用模块内的接口块编写一个过程.例如,
    MODULE ModExample
    INTERFACE 
        SUBROUTINE Sumatory(a, b, c)
            IMPLICIT NONE
            INTEGER, INTENT(IN)::a
            INTEGER, INTENT(OUT)::b
            INTEGER, INTENT(OUT)::c
        END SUBROUTINE Sumatory
    END INTERFACE
    END MODULE ModExample
   SUBROUTINE Sumatory(a, b, c)
      IMPLICIT NONE
      INTEGER, INTENT(IN)::a
      INTEGER, INTENT(OUT)::b
      INTEGER, INTENT(OUT)::c
      !Executable statements here
   END SUBROUTINE Sumatory
这对我有用.但它也可以使用模块内部的CONTAINS语言编写,实际上这就是我参考过的Fortran书籍中编写示例程序的方法.
MODULE ModExample
CONTAINS
SUBROUTINE Sumatory(a, b, c)
    IMPLICIT NONE
    INTEGER, INTENT(IN)::a
    INTEGER, INTENT(OUT)::b
    INTEGER, INTENT(OUT)::c
    !Executable statements here
END SUBROUTINE Sumatory
END MODOULE ModExample
那么INTERFCE块有什么问题呢?两者都是等效结构吗?我应该使用哪两种方法?也许所有这些问题都可以用一个很大的"它取决于"来回答,但我希望你能解释一下它们之间的差异.提前致谢.
我的印象是,Fortran中子程序和函数之间的主要区别在于函数返回值,而子程序更改了作为参数传递的部分或全部值.但后来我了解到你可以修改传入函数的变量作为参数.我很困惑,也找不到它们之间差异的好参考.
那么,这两种结构之间有什么区别,何时以及为什么一种优先于另一种?
这在Perl v5.22中得到修复.
Perl v5.18的词法子程序是否有排序?我今天终于有了一个用途,我有一个复杂的排序例程,它依赖于数据结构中的当前位置来查看更深的部分.
这是一个小程序:
use v5.18;
use feature qw(lexical_subs);
no warnings qw(experimental::lexical_subs);
my sub by_numbers { $a <=> $b }
my @sorted = sort by_numbers qw( 4 8 2 3 0 5 7 6 1 9 );
say "sorted: @sorted";
显然sort对此一无所知,因为它仍然在寻找%main::命名子例程:
% perl5.18.2 test.pl
Undefined sort subroutine "main::by_numbers" called at test.pl line 7.
% perl5.20.1 test.pl
Undefined sort subroutine "main::by_numbers" called at test.pl line 7.
我有点失望,因为这是rjbs 在perl 5中的词法子例程中使用的第一个用例.
这部分并不重要,因为我查看了当前版本的测试而不是v5.18版本. …
subroutine ×10
perl ×5
fortran ×3
function ×3
arguments ×1
batch-file ×1
coding-style ×1
hash ×1
inline ×1
interface ×1
label ×1
lexical ×1
module ×1
parameters ×1
perl5.18 ×1
procedure ×1
raku ×1
rakudo ×1
regex ×1
scope ×1