我正在使用Perl进行与安全相关的任务,并且想知道何时发表如下声明:
$test = "new value"
执行,是$test在RAM中覆盖创建的旧值?
如果没有,有没有办法强迫这种情况发生?
我正在使用Perl的Archive :: Tar模块.它的问题在于它将所有内容都拉到内存并进行归档,然后写入文件系统,因此可以归档的最大文件大小有限制.大多数时候,它说内存不足.在GNU tar的情况下,它需要文件块,将其存档并将其写入内存,以便它可以处理任何大小的文件.我怎么能用Perl的Archive :: Tar模块做到这一点.
一个常见的'Perlism'生成一个列表,作为以这种形式循环的东西:
for($str=~/./g) { print "the next character from \"$str\"=$_\n"; }
在这种情况下,全局匹配正则表达式从字符串返回一个依次为一个字符的列表,$str并将该值赋给$_
取而代之的是正则表达式,split可以以同样的方式或使用'a'..'z',map等等.
我正在调查unpack通过字符串的字段解释生成字段.我总是发现unpack我的大脑工作方式不太直白,我从来没有真正深入挖掘它.
作为一个简单的例子,我要生成一个列表,是从一个字符串中使用解包中的每个元素的一个字符(是的-我知道我能做到这一点split(//,$str)和/./g,但我真的想看看解包可以采用这种方式.. .)
显然,我可以使用字段列表进行解包,unpack("A1" x length($str), $str)但是有没有其他方式看起来像通配?即,我unpack(some_format,$str)可以在列表上下文或循环中调用,以便解压缩将返回格式组中的下一组字符,直到$ str被排除?
我已经阅读了Perl 5.12 Pack pod和Perl 5.12 pack教程以及Perkmonks教程
以下是示例代码:
#!/usr/bin/perl
use warnings;
use strict;
my $str=join('',('a'..'z', 'A'..'Z')); #the alphabet...
$str=~s/(.{1,3})/$1 /g; #...in groups of three
print "str=$str\n\n";
for ($str=~/./g) {
print "regex: = $_\n";
}
for(split(//,$str)) …Run Code Online (Sandbox Code Playgroud) 我目前正在研究一些轻量级的SQL抽象模块.我的工作流程是这样的,我通常手动编写SELECT查询,并通过带有哈希的子进行INSERT/UPDATE查询.
这两个模块似乎都很适合我的需求,我很难决定.SQL :: Interp声称SQL :: Abstract无法在SQL中提供完整的表达能力,但没有讨论其他差异.
它有任何缺点吗?如果是这样,哪个?
我使用下面的代码从XML文件中获取节点的值:
use XML::XPath;
use XML::XPath::XMLParser;
my $pt1 = XML::XPath->new(filename => 'test1.xml');
my $nodeset = $pt1->find('/file1/table/tname');
foreach my $node ($nodeset->get_nodelist)
{
print $node->getNodeValue."\n";
}
Run Code Online (Sandbox Code Playgroud)
'test1.xml'的内容如下:
<file1>
<table>
<tname>_sys_ident</tname>
<ttype>regular</ttype>
<col>
<name>_sys_ident_asp</name>
<type>varchar(16)</type>
<fkey>_sys_asp</fkey>
<attr>PRIMARY KEY</attr>
</col>
</table>
</file1>
Run Code Online (Sandbox Code Playgroud)
我想打印tname的值(即_sys_ident).但上面的代码没有打印任何东西.
如果我在for循环中使用以下内容:
print XML::XPath::XMLParser::as_string($node);
Run Code Online (Sandbox Code Playgroud)
然后,它给出以下输出:
<tname>_sys_ident_asp</tname>
Run Code Online (Sandbox Code Playgroud)
我不想要这个完整的节点名称和值字符串.我只想要节点值. 这是我第一次尝试使用XML和XPath.请告诉我我做错了什么.
我知道这$@是一个全局变量的事实,我仍然无法弄清楚为什么我需要在使用eval之前对其进行本地化:
例如:
eval { SOME_FUNC_THAT_MAY_DIE(); };
if ($@) {
print "An error occured!\n";
}
Run Code Online (Sandbox Code Playgroud)
我能想到的唯一可能的事情是,如果某个信号处理程序会die在我尝试阅读的同时调用,$@我在这里缺少什么?
我尝试这样的代码:
my @rows = getRows($sth);
$self->stash(rows => \@rows);
Run Code Online (Sandbox Code Playgroud)
getRows是一个子函数名,代码在模板中工作.$ rows是一个数组.
我写这样的代码:
$self->stash(rows => \getRows($sth));
Run Code Online (Sandbox Code Playgroud)
$ rows是REF,这是错误的.
如果写代码如下:
$self->stash(rows => getRows($sth));
Run Code Online (Sandbox Code Playgroud)
$ rows是HASH,这是错的.
有没有办法把两行代码写在一个?
我正在尝试实现一个Moose :: Role类,其行为类似于Java中的抽象类.我想在Role中实现一些方法,但是能够在具体类中覆盖这些方法.如果我尝试使用与扩展类时相同的样式,我会得到错误Cannot add an override method if a local method is already present.这是一个例子:
我的抽象类:
package AbstractClass;
use Moose::Role;
sub my_ac_sub {
my $self = shift;
print "In AbstractClass!\n";
return;
}
1;
Run Code Online (Sandbox Code Playgroud)
我的具体课程:
package Class;
use Moose;
with 'AbstractClass';
override 'my_ac_sub' => sub {
my $self = shift;
super;
print "In Class!\n";
return;
};
__PACKAGE__->meta->make_immutable;
1;
Run Code Online (Sandbox Code Playgroud)
然后:
use Class;
my $class = Class->new;
$class->my_ac_sub;
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么?我想要完成的是应该以不同的方式完成的吗?我不想做什么?
我正在使用PhantomJS从HTML生成PDF.我想要一个页面页脚,上面写着"第1页,共5页","第2页,共5页"等.有没有办法用PhantomJS做到这一点?
(我知道基于CSS3页面的计数器,但据我所知,PhantomJS不支持它们.)
这个 Raku 程序按我的预期工作:
sub MAIN($name) { say "Got $name" }
Run Code Online (Sandbox Code Playgroud)
我可以在命令行上传递一个名称:
$ raku m1.raku foo
Got foo
Run Code Online (Sandbox Code Playgroud)
然而,明显的扩展,
sub MAIN(@names) { say "Got $_" for @names }
Run Code Online (Sandbox Code Playgroud)
不起作用:
$ raku mm.raku foo
Usage:
mm.raku <names>
$ raku mm.raku foo bar
Usage:
mm.raku <names>
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?