我使用Perl生成相对较大的文件.我生成的文件有两种:
表文件,即文本文件我逐行(逐行)打印,主要包含数字.典型的线条如下:
126891 126991 14545 12
我创建的序列化对象然后使用存储到文件中Storable::nstore.这些对象通常包含一些带有数值的大哈希.可能已经pack编辑了对象中unpack的值以节省空间(并且在使用之前对象是每个值).
目前我通常会做以下事情:
use IO::Compress::Gzip qw(gzip $GzipError);
# create normal, uncompressed file ($out_file)
# ...
# compress file using gzip
my $gz_out_file = "$out_file.gz";
gzip $out_file => $gz_out_file or die "gzip failed: $GzipError";
# delete uncompressed file
unlink($out_file) or die "can't unlink file $out_file: $!";
Run Code Online (Sandbox Code Playgroud)
这是非常低效的,因为我首先将大文件写入磁盘,然后gzip再次读取并压缩它.所以我的问题如下:
我可以在没有先将文件写入磁盘的情况下创建压缩文件吗?是否可以按顺序创建压缩文件,即像前面描述的方案(1)中一样逐行打印?
的确Gzip听起来像一个合适的选择?aRe还有其他推荐的压缩机用于我描述的数据类型吗?
pack对象中的值是否有意义,以后将被存储和压缩?
我的考虑主要是节省磁盘空间并允许以后快速解压缩.
我正在使用Text :: MultiMarkdown从Perl打印到HTML。
我想创建一个表,其中的某些单元格包含一些字符串,每个字符串都在单元格中的单独一行中(请参见下图中的“四个五个六个”)。
我可以这样做吗?
按照phaylon的回答"如何灵活地向Moose对象添加数据?" ,假设我有以下Moose属性:
has custom_fields => (
traits => [qw( Hash )],
isa => 'HashRef',
builder => '_build_custom_fields',
handles => {
custom_field => 'accessor',
has_custom_field => 'exists',
custom_fields => 'keys',
has_custom_fields => 'count',
delete_custom_field => 'delete',
},
);
sub _build_custom_fields { {} }
Run Code Online (Sandbox Code Playgroud)
现在,假设我想尝试读取(但不是写入)不存在的自定义字段时会呱呱叫.我被phaylon建议custom_field用一个环绕修饰语包裹.我已经around按照Moose文档中的各种示例尝试了修饰符,但无法确定如何修改句柄(而不仅仅是对象方法).
或者,是否有另一种方法来实现这个croak-if-try-to-read-unfxisting-key?
我正在编写一个使用外部脚本的Perl脚本.外部脚本必须从特定目录运行,因此我发现以下内容非常有用:
use IPC::System::Simple qw(capture);
my @args = ('external script path...', 'arg1', ...);
my $out = capture( [0], "cd $dir ; @args" );
Run Code Online (Sandbox Code Playgroud)
有时外部脚本会将内容写入STDERR,但仍会返回0.我希望捕获这些时间和confess(或die).由于我不控制外部脚本的返回值,我想也许我可以捕获它的STDERR所以我会有这样的东西:
my ($out, $err) = cool_capture( [0], "cd $dir ; @args" );
say "Output was: $out";
if ($err) {
die "Error: this was written to STDERR: $err";
}
Run Code Online (Sandbox Code Playgroud)
我能做什么?
我想传递一个perl程序一组参数和标志,例如 my_script.pl --flag1 --arg1=value --flag2 …
有没有办法快速将所有这些转换为一些标准结构(哈希)而不是解析?
谢谢,戴夫
我有以下数据帧(df)
start end
1 14379 32094
2 151884 174367
3 438422 449382
4 618123 621256
5 698271 714321
6 973394 975857
7 980508 982372
8 994539 994661
9 1055151 1058824
. . .
. . .
. . .
Run Code Online (Sandbox Code Playgroud)
还有一个带有布尔值(vec)的长布尔向量.
我想过滤掉df其中包含TRUE相应位置中至少一个值的所有范围vec.
换句话说,start=x end=yiff将输出一行!any(vec[x:y]).
有关如何实现这一目标的任何想法?
KiokuDB教程 提到的弱引用究竟是什么?
它们与"正常"参考文献有何不同?