我有一些我称之为的子程序myWrite($fileName, \@data). myWrite()打开文件并以某种方式写出数据.我想修改,myWrite以便我可以像上面那样调用它或者使用文件句柄作为第一个参数.(这种修改的主要原因是将文件的开头委托给调用脚本而不是模块.如果有一个更好的解决方案来告诉IO子程序在哪里写,我很高兴听到它. )
为了做到这一点,我必须测试第一个输入var是否是文件句柄.我通过阅读这个问题想出了如何做到这一点.
现在这是我的问题:我还想测试是否可以写入此文件句柄.我无法弄清楚如何做到这一点.
这就是我想要做的事情:
sub myWrite {
my ($writeTo, $data) = @_;
my $fh;
if (isFilehandle($writeTo)) { # i can do this
die "you're an immoral person\n"
unless (canWriteTo($writeTo)); # but how do I do this?
$fh = $writeTo;
} else {
open $fh, ">", $writeTo;
}
...
}
Run Code Online (Sandbox Code Playgroud)
我需要知道的是,如果我可以写入文件句柄,虽然看到一些通用解决方案可以告诉您是否使用">>"或"<"打开文件句柄,或者如果不是开放等
(请注意,这个问题是相关的,但似乎没有回答我的问题.)
我有这个子例程,其标识符定义为
*VALID_NAME_REG_EX = \"[ a-zA-Z0-9_#.:@=-]+";
*MACRO_VALID_NAME = \"MACRO_VALID_NAME";
Run Code Online (Sandbox Code Playgroud)
我进一步查看了该文件.它们被引用为$MACRO_VALID_NAME.
我想这是用字符串的右侧替换值,但我不确定这个并想要确认.
请你能解释一下这种明显不一致的行为:
use strict;
my @a;
print "a" x 2; # this prints: aa
@a = "a" x 2; print @a; # this prints: aa
print ("a") x 2; # this prints: a
@a = ("a") x 2; print @a; # this prints: aa
Run Code Online (Sandbox Code Playgroud)
不应该最后一个打印一个'a'?
编辑:好的,现在这对我来说更有意义:"二进制"x"是重复运算符...在列表上下文中,如果左操作数括在括号中或者是由qw/STRING /形成的列表,它重复了这个清单." perlop得到
这对我来说很清楚(二进制x - 为什么使用二进制这个词?是否有一个否定X?)但无论如何:@a =("a")x 2#似乎在列表上下文中,因为我们有一个数组在开头 - 一个数组不是一个列表,但它包含一个列表,所以我认为我们可能有一个列表上下文,(虽然它们可能是同义词,但不是数组上下文).
我想"左操作数"是("a").(或者是那个或@a).perlop没有说明操作数实际上是什么,查询perldoc.perl.org给出"找不到匹配",谷歌搜索给出"在计算机编程中,操作数是用于描述任何能够被操纵的对象的术语".就像数组一样.
因此左操作数可能会括在括号中,所以它可能会"重复列表".该列表是:("a") x 2
或者是:("a")
如果我们重复,("a") x 2我们会得到("a") x 2 ("a") x 2.这似乎不对.
如果我们键入:print $a[1]我们将得到一个'a',所以"它重复列表"意味着Perl变成("a") …
那里 - 刚刚开始学习 Perl。
这就是我正在做的将数组放入子函数中的过程 - 可以在 1 行中更简单地完成吗?
sub my_sub {
my $ref_array = shift;
my @array = @$ref_array;
}
Run Code Online (Sandbox Code Playgroud)