我需要从文件中读取,遍历它并将该行写入另一个文件.当行数达到阈值时,关闭输出文件句柄并打开一个新句柄.
每次从输入文件句柄读取一行时,如何避免打开和关闭输出文件句柄?
use autodie qw(:all);
my $tot = 0;
my $postfix = 'A';
my $threshold = 100;
open my $fip, '<', 'input.txt';
LINE: while (my $line = <$fip>) {
my $tot += substr( $line, 10, 5 );
open my $fop, '>>', 'output_' . $postfix;
if ( $tot < $threshold ) {
print {$fop} $line;
}
else {
$tot = 0;
$postfix++;
redo LINE;
}
close $fop;
}
close $fip;
Run Code Online (Sandbox Code Playgroud) 我想使用以下正则表达式捕获几个文本:
$text_normal = qr{^(\/F\d+) FF (.*?) SCF SF (.*?) MV (\(.*?)SH$};
Run Code Online (Sandbox Code Playgroud)
字符串的示例如下所示:
my $text = '/F12345 FF FF this is SCF SF really MV (important stuff SH';
Run Code Online (Sandbox Code Playgroud)
可以重写以加快匹配吗?
有人可以向我解释下面的代码.这种行为已经有一段时间了(在5.8.5,5.8.8,5.10.1,5.12.2上测试过),所以必须有一个原因吗?
$ perl -M5.012 -E '$aa=2'
Global symbol "$aa" requires explicit package name at -e line 1.
$ perl -M5.012 -E '$a=2'
Run Code Online (Sandbox Code Playgroud)
谢谢.
我是Perl 5异步流程的新手,并且发现令人兴奋的是,CPAN提供了类似的支持,我们可以在Node.js中使用AnyEvent,IO :: Async等进行类似的支持.但是,本教程提供了一些复杂内容的示例.我需要的只是使用AnyEvent并行运行外部系统命令.
我是否在下面的示例中正确地执行了异步压缩多个文件?请不要担心运行系统命令zip而不是使用CPAN模块; 这个例子纯粹是为了演示运行异步进程的想法......
#!/bin/env perl
use strict;
use AnyEvent;
use AnyEvent::Util;
my $s1 = time;
my $quit_program = AnyEvent->condvar(
cb => sub {
warn "Done async";
}
);
my $result;
$quit_program->begin( sub { shift->send($result) } );
for my $file (@files) {
$quit_program->begin;
my $cv; $cv = run_cmd [qw(zip), "${file}.zip", $file],
"<" , "/dev/null",
">" , "/dev/null",
"2>", "/dev/null";
$cv->cb (sub {
shift->recv and die "command failed";
# undef $cv;
$quit_program->end;
}); …Run Code Online (Sandbox Code Playgroud) 我想在进行下一步之前验证一个条件,但只提出警告并跳过当前值而不是死亡.
如何在不返回任何值的情况下重写validate_me()子例程?
(更新)请注意,下面的代码按预期工作,它只是我想要其他东西,而不是从validate_me()返回1或0仍然允许代码行为相同.
foreach my $file ( @files ) {
validate_me($foo, $bar, $baz) or next;
do_something();
}
sub validate_me {
my ($foo, $bar) = @_;
if ( $foo > $bar ) {
carp("Something goes awol");
return 0;
}
if ( $bar != $baz ) {
carp("Odd");
return 0;
}
return 1; # success
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
这段代码闻起来......我该如何更好地重写它?
my $record;
eval {
while (
# undef $record here, so if getRecord() failed, nothing will be written
# in the reject file
do { undef $record; defined( $record = $dataFile->getRecord ) }
) {
$LT_DataFile->encode($record);
}
1;
};
if ( my $error = $@ ) {
$rejectFile->writeRecord( $error, $record );
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
我闻到了一些不好的东西?
if ($col == 24) {
$buffer{'Y'} = trim($val);
return;
}
if ($col == 25) {
$buffer{'Z'} = trim($val);
return;
}
if ($col == 26) {
$buffer{'AA'} = trim($val);
return;
}
if ($col == 27) {
$buffer{'AB'} = trim($val);
return;
}
您能否建议我使用任何CPAN模块来搜索大型文件?
该文件是一个大约1500万到2000万行的结构化数据,但我只需要找到大约25,000个匹配的条目,所以我不想将整个文件加载到哈希中.
谢谢.
我使用了一个我无法控制的外部模块(比如说Foo.pm).使用它的方式如下,工作正常:
use Foo ();
my %config = (
MODE => 'NORMAL',
ERROR => \&my_error, # error handling routine
);
Foo::init(%config);
sub my_error {
my ($message) = @_;
...
}
Run Code Online (Sandbox Code Playgroud)
但是,my_error()当我用OO样式作为my_error()现在的第一个参数写入时,我无法传入外部模块$self:
package MyPackage;
use Foo ();
sub new {
my $self = bless {
environment => 'TEST',
config => {
MODE => 'NORMAL',
ERROR => \&my_error, # WRONG ??!
},
}, __PACKAGE__;
Foo::init( %{$self->{config}} );
}
sub my_error {
my ($self, $message) = …Run Code Online (Sandbox Code Playgroud) 我打算从Class :: DBI转移到Rose :: DB :: Object,因为它的结构很好,而且与CDBI和DBIC相比,RDBO的速度更快.
但是在我的机器上(linux 2.6.9-89,perl 5.8.9),RDBO编译时间比CDBI慢得多:
$ time perl -MClass::DBI -e0 real 0m0.233s user 0m0.208s sys 0m0.024s $ time perl -MRose::DB::Object -e0 real 0m1.178s user 0m1.097s sys 0m0.078s
这有很多不同......
有人在这里遇到类似的行为
干杯.
@manni和@john:感谢有关RDBO引用的模块的解释,它肯定能解释为什么编译时比CDBI慢.
应用程序未在持久环境中运行.事实上,它是由几个同时运行2分钟,5分钟和x分钟间隔的cron作业调用的 - 所以是的,编译时间在这里至关重要......
Jonathan Rockway的App :: Persistent似乎很有趣,但是它(当前)限制只允许一次运行一个应用程序并不适合我的目的.当我们杀死客户端时,它也有问题,服务器进程仍在运行...
perl ×10
anyevent ×1
asynchronous ×1
file ×1
io-async ×1
loops ×1
perl5 ×1
regex ×1
strictures ×1