有没有一种更简洁的方式在Perl写这个?

这个子程序传递文件的数组处理用关闭,它会关闭一个接一个foreach循环:

sub closef { foreach(@_) { my $fh = shift; close $fh; } }

在哪里都可以这个简单的子程序进行修改,以使其更好?

我应该使用close shift做它在两行呢?

--------------解决方案-------------

foreach(@_) {
close $_;
}

要么

foreach my $fh (@_) {
close $fh;
}

要么

close $_ foreach (@_);

最简洁的方法是使用词汇的文件句柄,当他们走出去的范围,它会自动关闭:

sub firstline {
open( my $in, shift ) && return scalar <$in>;
# no close() required
}

请参阅perldoc perlopentut。

sub closef { close $_ for @_ }

但是, close功能确实有返回值,你通常会做很好地研究它。 因此,

sub closef { map { close $_ } @_ }

您的代码是不是做你的想法。 你说你要关闭传递到每个常规文件句柄,但你只关闭其中的一些。 考虑下面的例子:

sub t{
foreach(@_){
my $tmp = shift;
print $tmp;
}
}

t(('a'...'d'));

这将输出

ab

尽管参数列表是A,B,C和D。 这是因为,在每个迭代上移将被调用。 为了得到你想要使用的那种行为

sub t{
foreach(@_){
my $tmp = $_;
print $tmp;
}
}

t(('a'...'d'));

或者,更好,不使$ _副本,只是它的别名:

sub t{
foreach my $tmp (@_){
print $tmp;
}
}

t(('a'...'d'));

有一个问题的子程序最初发布。

shift函数需要一个数组作为参数。 内部的隐变量foreach是一个标量。

这意味着$fh仍然未初始化。 之所以它很可能被忽视,是因为(尤金Ÿ指出)词法文件句柄封闭自己,当他们走出去的范围。

顺便说一句, use warnings;将通知有关这样的事情。

更惯用的方法是使用while循环:

sub closef {

while ( my $fh = shift @_ ) {
close $fh;
}
}

更紧凑的符号,一个for循环是要走的路:

sub closef { close for @_; }

与等效while循环也不是那么可读:

sub closef { close while $_ = shift }

更新

迈克尔·卡曼的评论下面在这里成立。 该shift修改被遍历数组,这使得它的不安全的操作。 这是,事实上这个问题。

或者,你也可以使用地图:

map { close $_ } @_;

有了地图,你甚至可以得到非常接近的所有结果的数组,如果你要处理它。

my @results = map { close $_ } @_;

分类:perl的 时间:2012-01-01 人气:0
本文关键词: perl的,文件
分享到:

相关文章

  • 如何在Perl检查文件权限比755更大? 即集团/世界具有写权限 2012-03-12

    对于UNIX文件,我想知道,如果集团或世界对文件的写权限. 我一直在思考这些行: my $fpath = "orion.properties"; my $info = stat($fpath) ; my $retMode = $info->mode; $retMode = $retMode & 0777; if(($retMode & 006)) { # Code comes here if World has r/w/x on the file } 谢谢. --

  • 从C Determing perl的文件的行号和文件名++ 2012-04-26

    我与嵌入到我们的应用程序的Perl工作. 我们已经安装了从Perl中称为了不少C ++函数. 其中之一是一个记录功能. 我想补充一点,调用此函数日志消息Perl的文件的文件名和行号. 我知道Perl的一面,我可以用"主叫()"函数来获取此信息,但这个函数是在数百个地点已被使用,所以我宁愿修改C ++的一面,就是这个信息传递给C ++ XSUB功能如果是的话我将如何得到它? 谢谢. --------------解决方案------------- 这应该工作: char *file; I3

  • 如何在Windows上运行的perl XAMPP文件? 2012-05-31

    我是新来的Perl语言,我试图运行它,因为我的PHP文件做的,插入的htdocs文件,然后访问它们在本地主机. 下面是我创造的,但没能在本地主机运行perl的文件: ----- hello.pl --------------- #!/usr/bin/perl print "Hello World.\n"; --------------解决方案------------- 如果你的PHP安装有Perl模块,可以直接从PHP评估Perl代码. <?php print "Hel

  • Makefile文件:从源代码目录复制的Perl / Python文件到构建目录 2012-07-10

    我有以下的源目录结构 src: dir1: c++ files, Makefile dir2: perl/python scripts, Makefile build: bin: binary-executables bin-subdir: I want my perl/python files to be copied during the build process. 此外,当我做了make install ,将在bin-subdir复制到install/bin默认或我指定呢? ------

  • 运行HTML / JavaScript为Perl的文件 2012-10-12

    我在我的Perl文件中的数组,我使用填充在另一个PHP页面的下拉菜单. 所以我有一个称为---> php.php一个perl.pl文件. 现在,这是我的PHP文件中的代码 $output = shell_exec("/usr/bin/perl perl.pl $arg1 $arg2"); echo $output; 在我的Perl文件,这就是我通过在最后拿到的下拉菜单: print "<SELECT id='process_type'>\n"; f

  • 我一定要运行make / make install的测试每次更改一个Perl发布文件? 2012-10-22

    我一定要运行make和make install每更改一次.pm Perl的文件吗? 我做一吨的测试,这是成为累赘. --------------解决方案------------- 这取决于模块设置,但在标准的MakeMaker我用",请试"运行"做",如果任何文件已被修改,这样模块内的发展时,"做试验"是你需要,直到你的唯一命令"已经完成. 您没有安装该模块进行测试. 如果我测试在我的分发目录,我只是用了test目标: % make t

  • 有没有从一个Perl模块文件中提取出所有的变量,模块和函数名的工具? 2012-11-09

    我的道歉,如果这是一个重复; 我可能不知道正确的术语来搜索. 我任务是分析一个Perl模块文件(.pm后缀),这是一个较大的应用程序的一个片段. 是否有工具,应用程序或脚本,将简单地通过代码,并使出浑身的变量名,模块名称和函数调用? 更妙的是东西,将确定它是否该文件中声明或者是外部的东西. 有没有这样的工具存在? 我只得到了一个文件,所以这不是我能执行 - 只是一些基本的静态分析,我猜. --------------解决方案------------- 检查出新的,但值得推荐Class::Snif

  • 我如何获得的perl-support.vim认识到Perl的文件吗? 2013-03-16

    我安装的perl-support.vim 到〜/的.vim(解压缩). 当我创建一个新的特等文件,它让我看到默认的模板,这意味着我的安装成功(我猜). 我已经添加filetype plugin on 在〜/ .vimrc中和在/ etc / vimrc文件 . 如何输入一个perl-support命令? 写了建议输入\​​ ISU在正常模式下,用于创建一个新的子,但现在我打我的Vim变为插入模式并没有预期的情况发生. 我究竟做错了什么? --------------解决方案-----------

  • Perl的 - 文件编码和Word的比较 2013-04-20

    我有一个短语/项的每一行,我从STDIN读取到perl的文件. 我有停用词(如"A","骚","E")的列表,我想每个词逐一比较,如果它们相等删除. 问题是,我不能确定该文件的编码格式. 我得到这个从file命令: words.txt: Non-ISO extended-ASCII English text 我的Linux终端在UTF-8,它显示了一些单词正确的内容和别人不一样. 下面是其中一些的输出: condi<E3> conte

  • 我怎样才能复制文件名称中有特殊字符使用Perl的文件::复制? 2013-05-04

    我想所有的文件在一个位置复制到不同的位置,现在用的File::Copy模块,并copy命令从,但现在我所面临的问题是,我有文件,其名称有special character的ASCII值&#253但是在UNIX文件系统,它被存储为?所以我的问题是,将copy or move command考虑这个文件的特殊字符,而复制或移动到另一个位置,或没有,如果现在的话,这将是围绕着一个可能的工作为了这 ? 注:我不能在UNIX中创建文件中有特殊字符,因为特殊字符替换?我不能在Windows这样做,因为在Wi

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.715 (s). 10 q(s)