我想知道为什么
use warnings;
use strict;
Run Code Online (Sandbox Code Playgroud)
在Perl中不是默认值.每个脚本都需要它们.如果某人(有充分理由)需要禁用它们,则应使用no strict和/或使用某些命令行参数(对于单行).
是否有太多写得不好的CPAN模块(使用"糟糕"表示没有use strict)?或者是因为这会破坏生产中的许多代码?我确信有理由,我想知道.
5.14 IO::File是按需自动加载的,不可能用这些基本的pragma做类似的事情吗?
浏览源代码时,我看到以下几行:
my @files_to_keep = qw (file1 file2);
my %keep = map { + $_ => 1 } @files_to_keep;
Run Code Online (Sandbox Code Playgroud)
+这段代码片段做了什么?我曾经Data::Dumper看过取出加号是否做了什么,但结果是一样的:
$ perl cleanme.pl
$VAR1 = {
'file1' => 1,
'file2' => 1
};
Run Code Online (Sandbox Code Playgroud) perldoc 说"标量上下文中的列表赋值返回列表赋值右侧的元素数",但是当我尝试这段代码时:
perl -e '$_="aaaaa";print $v=(()=split //)'
Run Code Online (Sandbox Code Playgroud)
输出1让我感到困惑.(我期待的答案是5.)
任何人都能解释一下吗?
我试图找出在没有传递参数的情况和参数传递为0的情况下在Perl中区分的最佳方法,因为它们对我来说意味着不同的东西.
(通常我喜欢歧义,但在这种情况下我生成SQL所以我想用NULL替换未定义的args,但将0保留为0.)
所以这是含糊不清的:
sub mysub {
my $arg1 = shift;
if ($arg1){
print "arg1 could have been 0 or it could have not been passed.";
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,这是我最好的解决方案......但我认为这有点难看.我想知道你是否可以想到一个更清洁的方式或者这对你来说是否合适:
sub mysub {
my $arg1 = (defined shift) || "NULL";
if ($arg1 ne "NULL"){
print "arg1 came in as a defined value.";
}
else {
print "arg1 came in as an undefined value (or we were passed the string 'NULL')";
}
}
Run Code Online (Sandbox Code Playgroud) 您可以使用连词或&&来指定正则表达式仅在其所有组成部分都匹配时才匹配&:
[4] > \'ready\' ~~ / r..dy & .ea.. /\n\xef\xbd\xa2ready\xef\xbd\xa3\n[5] > \'roody\' ~~ / r..dy & .ea.. /\nNil\n[6] > \'peaty\' ~~ / r..dy & .ea.. /\nNil\nRun Code Online (Sandbox Code Playgroud)\n当选择交替匹配的哪一方时,Raku 选择“更好”的一方。这里有两条规则很重要:具有较长声明性前缀的替代方案比具有较短声明性前缀的替代方案更好,并且较早声明的替代方案比其同级方案更好。
\n&文档表明使用代替的部分原因&&是被&认为是声明性的。如果我正确理解最长的令牌匹配,那就是我想要的。
然而,如果我使用连接作为交替的一个分支,就会发生一些令人惊讶的事情:如果它的替代项没有连接,则永远不会选择它。它似乎被认为比在我看来相同长度的火柴短。
\n这很烦人,因为我正在编写一个解析器,在其中很自然地说“如果文本与这两个规则都匹配,则它实际上被认为是联合规则的示例”。语法始终倾向于寻找构成规则而不是联合规则。
\n以下 REPL 示例都是模式的变体,其中我们使用联合替代方案和非联合替代方案进行交替,我们想知道为什么选择非联合替代方案:
\n\'froody\' ~~ / froody & froody | froody /\nRun Code Online (Sandbox Code Playgroud)\n(REPL 交互具有诊断代码和额外的括号,以确保我不会遇到优先级问题。)
\n在这里,交替的两侧在我看来应该被认为是相同的长度,所以我希望它选择左边的分支。它选择正确的分支。
\n[7] > \'froody\' ~~ / [ [ froody & froody ] { …Run Code Online (Sandbox Code Playgroud) 在Perl中,将字符串用作包含8位数据的字节数组是否合适?我在这个主题上找到的所有文档都集中在7位字符串上.
例如,如果我从二进制文件中读取一些数据 $data
my $data;
open FILE, "<", $filepath;
binmode FILE;
read FILE $data 1024;
Run Code Online (Sandbox Code Playgroud)
我希望得到第一个字节,是否substr($data,1,1)合适?(再次,假设它是8位数据)
我来自一个主要是C的背景,我习惯于将char指针传递给一个read()函数.我的问题可能是我不明白字符串的底层表示是什么在Perl中.
为什么在Perl中:
@x=(0,2);
substr('abcd',@x)
Run Code Online (Sandbox Code Playgroud)
评价为"cd"?
还有这个:
substr('abcd',0,2);
Run Code Online (Sandbox Code Playgroud)
评价为"ab"?
我试图找到while循环的时间复杂性,我不知道从哪里开始.我理解如何找到for循环的复杂性类,但是当涉及while循环时,我完全迷失了.关于从哪里开始的任何建议/提示?
这是一个问题的例子:
x = 0;
A[n] = some array of length n;
while (x != A[i]) {
i++;
}
Run Code Online (Sandbox Code Playgroud) 我无法理解Windows中perl的命令参数引用.使用以下程序:
use strict;
use warnings;
use File::Find;
use File::Copy;
my $dir = shift;
die 'Usage: perl Folderize.pl <directory>' unless $dir;
die "$dir doesn't exist" unless -d $dir;
Run Code Online (Sandbox Code Playgroud)
我得到不同的结果取决于我是否使用单引号或双引号作为目录.如果我打电话给它'perl script.pl 'H:\Test!'打印"'H:\ Test!' 不存在".但是,如果我打电话给它'perl script.pl "H:\Test!",它的工作正常.为什么会这样?
当我使用Test::Class和Test::More进行系统测试时,测试用例似乎是并行执行的。但是,我的测试在它们之间存在依赖关系,因此我希望连续执行测试。我怎样才能做到这一点?