我想看看是否有可能定义新的关键字,或者在用Python讨论Ruby时,在WAT的Destroy All Software谈话中调用它们.
我想出了一个我在其他地方找不到的答案,所以我决定在StackOverflow上分享它的问答风格.
看一下Type::Tiny,我看到对的调用中的类名在Type::Tiny->new官方文档中被引用,
my $NUM = "Type::Tiny"->new(
name => "Number",
constraint => sub { looks_like_number($_) },
message => sub { "$_ ain't a number" },
);
Run Code Online (Sandbox Code Playgroud)
为什么是这样?这仅仅是样式吗?这种做法是否会对性能产生影响?
在示例中,它们具有正常的$ -prefixed变量用于文件句柄的位置:
open(my $fh, "<", "input.txt")
Run Code Online (Sandbox Code Playgroud)
以及使用裸字的示例:
open(FOO, "|tr '[a-z]' '[A-Z]'");
Run Code Online (Sandbox Code Playgroud)
一个问题是每个样式的名称是什么,在每种情况下"我正在使用_ _作为文件句柄"?另一种是,为什么他们开始使用裸字的open()文档中?它似乎是后来的用途都不涉及正常的文件名open().在这些情况下,$ -prefixed表单是不可接受的吗?
Perl文档推荐这个:
$foo = $bar =~ s/this/that/r;
Run Code Online (Sandbox Code Playgroud)
但是,我收到此错误:
Bareword found where operator expected near
"s/this/that/r" (#1)
Run Code Online (Sandbox Code Playgroud)
这是r修饰符特有的,没有代码可以工作.但是,我不想修改$bar.当然,我可以替换
my $foo = $bar =~ s/this/that/r;
Run Code Online (Sandbox Code Playgroud)
同
my $foo = $bar;
$foo =~ s/this/that/;
Run Code Online (Sandbox Code Playgroud)
有更好的解决方案吗?
为什么下面的use行是合法的 Perl 语法?(改编自父级POD ;在 Cygwin 上的 Perl 5.26.2 x64 上进行测试。)
package MyHash;
use strict;
use Tie::Hash;
use parent -norequire, "Tie::StdHash";
# ^^^^^^^^^^ A bareword with nothing to protect it!
Run Code Online (Sandbox Code Playgroud)
在 下-MO=Deparse,该use行变为
use parent ('-norequire', 'Tie::StdHash');
Run Code Online (Sandbox Code Playgroud)
但我无法从use文档中看出 引用的来源-norequire。
如果use strict不是强制的话,我会理解的。裸字norequire将变成 string "norequire",一元减号将将该字符串变成"-bareword",并且生成的字符串将进入use导入列表。例如:
package MyHash;
use Tie::Hash;
use parent -norequire, "Tie::StdHash";
Run Code Online (Sandbox Code Playgroud)同样,如果有一个粗逗号,我也会理解。 -foo => bar变成"-foo", …
为什么 Perl(5.30.3 以及no feature ':all')假定连接运算符后面的裸字.是字符串?例如:
use v5.30; # or: no feature ':all';
use strict;
use warnings;
my $k1 = 'a';
my $k2 = 'b';
print STDOUT $k1 . k2 . "\n";
Run Code Online (Sandbox Code Playgroud)
打印出来ak2(ab是有意的),并且不会引发此处不允许使用裸字的例外情况。这是我的脚本中的一个错误,但不一定是 Perl 中的错误。
根据perlglossary,裸词是指“根据 ,其含义足够模糊,被视为非法的词use strict 'subs'”。然而,由于$k2之前定义了一个名为 name 的标量k2,所以我认为k2它已经足够模糊了。
奇怪的是,第二个裸字引发了异常:
use v5.30; # or: no feature ':all';
use strict;
use warnings;
my $k1 = 'a';
my $k2 = 'b';
my $k3 …Run Code Online (Sandbox Code Playgroud) 我在Perl中尝试过这个例子.有人可以解释为什么这是真的吗?
if (defined sdf) { print "true"; }
Run Code Online (Sandbox Code Playgroud)
它打印true.
sdf可以是任何名称.
另外,如果定义了sdf函数并且它返回0,则它不会打印任何内容.
print (sdf); 不打印sdf字符串但是
if (sdf eq "sdf")
{
print "true";
}
Run Code Online (Sandbox Code Playgroud)
打印真实.
如果sdf是一个字符串,则相关问题仍然存在.什么不是印刷品?
给定这样的代码,我不会收到任何警告。
use strict;
use warnings;
open STDERR, '>&', STDOUT;
Run Code Online (Sandbox Code Playgroud)
鉴于此代码,我收到一个致命错误。
use strict;
use warnings;
use autodie;
open STDERR, '>&', STDOUT;
Run Code Online (Sandbox Code Playgroud)
在 ./test.pl 第 6 行使用“strict subs”时不允许使用裸字“STDOUT”。由于编译错误,./test.pl 的执行中止。
为什么autodie将严格的 subs 指向这个错误的根源——在第一个例子中显然是严格的,而我没有错误。
随着diagnostics误差这样的解释..
在 ./test.pl 第 7 行使用“strict subs”时不允许使用裸字“STDOUT”。由于编译错误,./test.pl 的执行中止 (#1) (F) 使用“strict subs”时,a裸字只允许作为子程序标识符,在大括号中或在“=>”符号的左边。也许您需要预先声明一个子程序?
这都可以通过做来解决
open STDERR, '>&', *STDOUT;
Run Code Online (Sandbox Code Playgroud)
那么它不是一个裸字,但是为什么裸字是特殊的,没有autodie,而不是autodie?这里发生了其他事情吗?
我编写了这段代码,它在系统中安装POE模块时有效.
#!/usr/bin/perl
use strict;
use warnings;
use POE;
...
Run Code Online (Sandbox Code Playgroud)
但是我想确定这个模块是否存在:
#!/usr/bin/perl
use strict;
use warnings;
eval("use POE; 1") or die ('Please, install POE module. \n');
...
Run Code Online (Sandbox Code Playgroud)
它返回:
Bareword "KERNEL" not allowed while "strict subs" in use at ./terminalhero.perl line 58.
Bareword "HEAP" not allowed while "strict subs" in use at ./terminalhero.perl line 60.
Execution of ./terminalhero.perl aborted due to compilation errors.
Run Code Online (Sandbox Code Playgroud)
我尝试了其他模块,但也有错误.如何使用严格模式执行我想要的操作?
为了运行我的Perl脚本,我需要在OS上设置一个环境变量来指向我们的开发服务器:
export SERVER=DEV
但是,一旦将脚本分发给我们的用户,我不希望他们每次都需要导出此环境变量.因此,我想我会在我的脚本开头附近设置环境变量.所以我补充说:
$ENV{SERVER}=DEV;
但是,由于严格的subs,我的脚本不允许这样做:
Bareword "DEV" not allowed while "strict subs" in use
我的部门主管一定得到了保证我们必须在我们的脚本中使用strict,所以没有办法克服这个限制.有没有正确的方法来设置我忽略的裸字环境变量?
我理解裸字可以用作引用运算符(q //,qq //),哈希键等的字符串.我个人对此并不太兴奋,因为我无法克服心理上的期望应引用字符串,如C,C++中所示.但是,如果我采用引用字符串和裸字的混合使用,我想确保我不会意外地在脚中射击自己,在运行时裸字不能正常运行.
请排除"use strict"在编译时将其作为错误捕获的用例.我总是启用'严格'模式,所以我不关心这些情况.
以下是基于所提供的答案和评论的代码说明:
#!/usr/bin/perl
use strict;
use constant SIZE => "const_size";
sub size {
return "getsize";
}
my $href = {
size => 1,
getsize => 2,
const_size => "CONST_SIZE",
SIZE => "LARGE",
};
print "constant SIZE:", SIZE, "\n";
print "1. \$href->{size}:", $href->{size}, "\n";
print "1a. \$href->{size()}:", $href->{size()}, "\n";
print "2. \$href->{getsize}:", $href->{getsize}, "\n";
print "3. \$href->{SIZE}:", $href->{SIZE}, "\n";
print "3a. \$href->{(SIZE)}:", $href->{(SIZE)}, "\n";
Run Code Online (Sandbox Code Playgroud)
输出:
$ ./bare_word.pl
constant SIZE:const_size
1. $href->{size}:1
1a. $href->{size()}:2
2. $href->{getsize}:2
3. $href->{SIZE}:LARGE …Run Code Online (Sandbox Code Playgroud) 我有一段遗留的 perl 代码,它使用perl DBI和类似的结构
$db->bind_param(1, $some_blob, {TYPE => SQL_BLOB});
Run Code Online (Sandbox Code Playgroud)
其中 SQL_BLOB 是一个裸词。我想在同一个文件中使用严格的编译指示,但它会抱怨裸字。('在使用“严格的subs”时不允许使用裸字“SQL_BLOB”')我可以以某种方式免除此行的严格检查吗?