当前位置:  开发笔记 > 编程语言 > 正文

在Perl中将文件粘贴到字符串中的最佳方法是什么?

如何解决《在Perl中将文件粘贴到字符串中的最佳方法是什么?》经验,为你挑选了10个好方法。

是的,有多种方法可以做,但必须有规范或最有效或最简洁的方式.我会添加我知道的答案,看看有什么渗透到顶部.

要清楚,问题是如何最好地将文件的内容读入字符串.每个答案一个解决方案



1> Leon Timmerm..:

这个怎么样:

use File::Slurp;
my $text = read_file($filename);

ETA:注意File-Slurp的Bug#83126:带编码的安全漏洞(UTF-8).我现在建议使用File :: Slurper(免责声明:我写了它),也因为它有更好的默认编码:

use File::Slurper 'read_text';
my $text = read_text($filename);

或路径:: Tiny:

use Path::Tiny;
path($filename)->slurp_utf8;


防止这种情况发生的最简单方法是首先检查文件是否存在...
请注意,最近发现File :: Slurp是一个巨大的安全问题:https://rt.cpan.org/Ticket/Display.html?id = 83126

2> brian d foy..:

我喜欢用do我在本地化的块来做这个,@ARGV所以我可以使用菱形运算符来为我做文件魔术.

 my $contents = do { local(@ARGV, $/) = $file; <> };

如果您需要更强大一些,可以轻松将其转换为子程序.

如果您需要能够处理各种特殊情况的强大功能,请使用File :: Slurp.即使您不打算使用它,请查看源代码以查看它必须处理的所有古怪情况. File :: Slurp有一个很大的安全问题,看起来没有解决方案.部分原因是它无法正确处理编码.即使我的快速回答也有这个问题.如果您需要处理编码(可能因​​为您没有默认设置UTF-8),这将扩展为:

my $contents = do {
    open my $fh, '<:encoding(UTF-8)', $file or die '...';
    local $/;
    <$fh>;
    };

如果您不需要更改文件,则可以使用File :: Map.


我很懒,写"我的$ contents = do {local(@ARGV,$ /)= $ file; <>};`,这是更少字符的完全相同的东西:)

3> Schwern..:

在编写File :: Slurp(这是最好的方式)时,Uri Guttman在许多啜饮方式方面做了大量研究,效率最高.他在这里写下了他的发现并将它们整合到了信息文件:: Slurp.


请注意,最近发现File :: Slurp是一个巨大的安全问题:https://rt.cpan.org/Ticket/Display.html?id = 83126

4> dreeves..:
open(my $f, '<', $filename) or die "OPENING $filename: $!\n";
$string = do { local($/); <$f> };
close($f);


请使用3参数open()

5> Tanktalus..:

要考虑的事情(特别是与其他解决方案相比):

    词汇文件句柄

    缩小范围

    减少魔法

所以我得到:

my $contents = do {
  local $/;
  open my $fh, $filename or die "Can't open $filename: $!";
  <$fh>
};

除非实际使用魔法<>,否则我不是魔法<>的忠实粉丝.而不是假装,为什么不直接使用公开电话?这不是更多的工作,而是明确的.(真正的魔法<>,特别是在处理" - "时,要完美仿效更多的工作,但我们不管怎样在这里使用它.)


如果对于那些在家中跟随的人来说并不明显,在大块结束时,$ fh超出范围并且文件句柄自动关闭.

6> dwarring..:

当您执行以下操作时,字符串的mmap(内存映射)可能很有用:

有非常大的字符串,你不想加载到内存中

想要盲目快速初始化(在访问时获得渐进的I/O)

对字符串进行随机或惰性访问.

可能想要更新字符串,但只是扩展它或替换字符:

#!/usr/bin/perl
use warnings; use strict;

use IO::File;
use Sys::Mmap;

sub sip {

    my $file_name = shift;
    my $fh;

    open ($fh, '+<', $file_name)
        or die "Unable to open $file_name: $!";

    my $str;

    mmap($str, 0, PROT_READ|PROT_WRITE, MAP_SHARED, $fh)
      or die "mmap failed: $!";

    return $str;
}

my $str = sip('/tmp/words');

print substr($str, 100,20);

更新:2012年5月

用File :: Map替换Sys :: Mmap之后,以下应该非常相同

#!/usr/bin/perl
use warnings; use strict;

use File::Map qw{map_file};

map_file(my $str => '/tmp/words', '+<');

print substr($str, 100, 20);



7> 小智..:
use Path::Class;
file('/some/path')->slurp;



8> zigdon..:
{
  open F, $filename or die "Can't read $filename: $!";
  local $/;  # enable slurp mode, locally.
  $file = ;
  close F;
}



9> moritz..:

这既不快,也不独立于平台,而且确实很邪恶,但这很短(我已经在拉里·沃尔(Larry Wall)的代码中看到了这一点;-):

 my $contents = `cat $file`;

孩子们,不要在家做;-)。



10> Prakash K..:
use IO::All;

# read into a string (scalar context)
$contents = io($filename)->slurp;

# read all lines an array (array context)
@lines = io($filename)->slurp;

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有