小编est*_*est的帖子

在Perl中,如何避免多次打开文件

我需要从文件中读取,遍历它并将该行写入另一个文件.当行数达到阈值时,关闭输出文件句柄并打开一个新句柄.

每次从输入文件句柄读取一行时,如何避免打开和关闭输出文件句柄?

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)

perl loops file perl5

8
推荐指数
1
解决办法
779
查看次数

如何加速我的Perl正则表达式匹配?

我想使用以下正则表达式捕获几个文本:

$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)

可以重写以加快匹配吗?

regex perl

5
推荐指数
3
解决办法
5518
查看次数

为什么Perl没有严格警告未申报的$ a?

有人可以向我解释下面的代码.这种行为已经有一段时间了(在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 strictures

5
推荐指数
2
解决办法
178
查看次数

如何使用AnyEvent和Perl并行运行外部命令

我是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)

perl asynchronous anyevent io-async

5
推荐指数
1
解决办法
827
查看次数

如何从子程序中返回任何内容?

我想在进行下一步之前验证一个条件,但只提出警告并跳过当前值而不是死亡.

如何在不返回任何值的情况下重写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)

谢谢.

perl

4
推荐指数
2
解决办法
1万
查看次数

如何重写此eval块

这段代码闻起来......我该如何更好地重写它?

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)

谢谢.

perl

2
推荐指数
1
解决办法
666
查看次数

我怎样才能重构这一系列重复的"if"块?

我闻到了一些不好的东西?

    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;
    }

perl

1
推荐指数
2
解决办法
378
查看次数

如何在Perl中搜索大型排序文件?

您能否建议我使用任何CPAN模块来搜索大型文件?

该文件是一个大约1500万到2000万行的结构化数据,但我只需要找到大约25,000个匹配的条目,所以我不想将整个文件加载到哈希中.

谢谢.

perl

1
推荐指数
2
解决办法
1203
查看次数

将代码引用传递给外部模块

我使用了一个我无法控制的外部模块(比如说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)

perl

1
推荐指数
1
解决办法
59
查看次数

我的Rose :: DB :: Object编译时间太慢了吗?

我打算从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

0
推荐指数
1
解决办法
345
查看次数

标签 统计

perl ×10

anyevent ×1

asynchronous ×1

file ×1

io-async ×1

loops ×1

perl5 ×1

regex ×1

strictures ×1