所以我有一个文件,简而言之就是这个问题......
#!/usr/bin/perl -w
package Foo;
use strict;
use POSIX;
...
sub remove {
...
}
...
Run Code Online (Sandbox Code Playgroud)
我得到一个错误,说子程序remove已被重新定义.我知道这个问题,remove在POSIX中有一个子程序.但是,我不知道如何处理它.这个问题通常如何解决?
我有一个像这样的Perl文件:
use strict;
f1();
sub f3()
{ f2(); }
sub f1()
{}
sub f2()
{}
Run Code Online (Sandbox Code Playgroud)
简而言之,f1在定义之前被调用.因此,Perl发出警告:"f1过早调用原型".但情况也是如此f2,唯一的区别是它是从另一个子程序内部调用的.它不会发出警告f2.为什么?
解决此问题的最佳方法是什么?
&f1();我在子程序中传递和读取参数时遇到问题,该子程序预计会有两个数组.
sub two_array_sum { # two_array_sum ( (1 2 3 4), (2, 4, 0, 1) ) -> (3, 6, 3, 5)
# I would like to use parameters @a and @b as simply as possible
}
# I would like to call two_array_sum here and pass two arrays, @c and @d
Run Code Online (Sandbox Code Playgroud)
我已经看过并尝试过网上的几个例子,但它们都没有为我工作.
当使用CALL命令在批处理脚本中调用标签时,你用GOTO:eof结束子程序,从那里发生了什么?它是否返回到子程序的CALL所在的位置?或者它是否在调用脚本的位置后继续?
例如:
ECHO It's for my college fund.
CALL :OMGSUB
ECHO *runs away and cries like a little girl*
:OMGSUB
ECHO Your mom goes to college.
GOTO:eof
ECHO *picks up jewelry box*
Run Code Online (Sandbox Code Playgroud)
在GOTO之后:eof哪条线接下来会回响?
假设Perl子例程返回一个数组:
sub arrayoutput
{
...some code...
return @somearray;
}
Run Code Online (Sandbox Code Playgroud)
我想从这里只访问一个特定的数组元素,比如第一个.所以我能做到:
@temparray=arrayoutput(argument);
Run Code Online (Sandbox Code Playgroud)
然后参考$temparray[0].
但这种简短的参考不起作用:$arrayoutput(some argument)[0].
我已经习惯了Python和Perl的新手,所以我仍然在寻找一些简短,直观,类似python的方式a=arrayoutput(some argument)[0]来获取这个值.我的Perl程序变得越来越长,使用像这样的临时数组似乎很难看.Perl有没有办法做到这一点?
可能重复:
'功能'和'程序'有什么区别?
我在网上搜索了这个问题的答案,我得到的答案是函数可以返回值,修改值等,但子程序不能.但我对这种解释并不满意,在我看来,差异不仅仅是术语问题.
所以我正在寻找一个更概念性的答案.
...
#!/usr/bin/env raku
# -*-perl6-*-
# 2021-5-30: Example of how a sub does not seem to be able to return 2 Hashes...
sub GetHashes
{
my %H = 100 => 2149, 101 => 2305, 102 => 2076, 103 => 1767, 104 => 1743 ;
my %G = 100 => 21493, 101 => 23053, 102 => 20763, 103 => 17673, 104 => 17433 ;
return( %H, %G );
}
my ( %H, %G ) = GetHashes ;
%H.say;
%G.say;
Run Code Online (Sandbox Code Playgroud)
...
我是一个老的 …
我在搞清楚如何引用外部模块文件中的子例程时遇到了一些麻烦.现在,我这样做:
外部文件
package settingsGeneral;
sub printScreen {
print $_[0];
}
Run Code Online (Sandbox Code Playgroud)
主要
use settingsGeneral;
my $printScreen = settingsGeneral::printScreen;
&$printScreen("test");
Run Code Online (Sandbox Code Playgroud)
但这导致错误:不能使用字符串("1")作为子程序ref,而"strict refs"在使用中
我总是确定如果我将一个Perl子程序传递给一个简单的标量,它就永远不会在子程序之外改变它的值.那是:
my $x = 100;
foo($x);
# without knowing anything about foo(), I'm sure $x still == 100
Run Code Online (Sandbox Code Playgroud)
所以,如果我想foo()改变x,我必须传递它的参考x.
然后我发现事实并非如此:
sub foo {
$_[0] = 'CHANGED!';
}
my $x = 100;
foo($x);
print $x, "\n"; # prints 'CHANGED!'
Run Code Online (Sandbox Code Playgroud)
数组元素也是如此:
my @arr = (1,2,3);
print $arr[0], "\n"; # prints '1'
foo($arr[0]);
print $arr[0], "\n"; # prints 'CHANGED!'
Run Code Online (Sandbox Code Playgroud)
这有点让我感到惊讶.这是如何运作的?是不是子程序只获取参数的值?它是如何知道它的地址的?
是否可以将方法分配给变量并将它们作为类中的参数传递给子例程?
我知道可以通过其他方法中的self.或self!(或任何命名为显式调用者)访问它们,但是我想知道是否有可能将方法的代码对象作为参数传递给另一个方法。
subroutine ×10
perl ×6
arrays ×2
raku ×2
batch-file ×1
call ×1
cmd ×1
external ×1
function ×1
perl6 ×1
reference ×1
return ×1
terminology ×1
theory ×1
warnings ×1