【问题标题】:random file name in perl generated with unusual charactersperl 中使用不寻常字符生成的随机文件名
【发布时间】:2017-10-10 10:08:42
【问题描述】:

使用下面的 perl 代码,我尝试在随机生成的文件中输出一些名称。但是这些文件是用这样的奇怪字符创建的:

"snp-list-boo.dwjEUq5Wu^J.txt"

而且,很明显,当我的代码查找这些文件时,它说不是这样的文件。另外,当我尝试使用“vi”打开文件时,它们会像这样打开

vi 'temporary-files/snp-list-boo.dwjEUq5Wu
.txt'

即在文件名中带有“新行”。有人请帮助我理解并解决这个奇怪的问题。非常感谢!

代码:

my $tfile = `mktemp boo.XXXXXXXXX`;
my $fh = "";
     foreach my $keys (keys %POS_HASH){
       open ($fh, '>>', "temporary-files/snp-list-$tfile.txt");
        print $fh "$keys $POS_HASH{$keys}\n";
        close $fh;
         }

【问题讨论】:

  • 这里,^J 不是文字 ^ 后跟文字 J。它是控制字符的表示。真的是line feed
  • my $tfile = `mktemp boo.XXXXXXXXX`;之后做chomp ($tfile);
  • 非常感谢! :-)

标签: bash perl mktemp


【解决方案1】:

mktemp 在其输出中返回一个换行符,您需要先使用chomp() 或chomp()。

与其使用外部的mktemp 程序,不如使用File::Temp

【讨论】:

    【解决方案2】:

    出于某些原因,不必要地使用外部程序是一个坏主意。

    • 您使用的外部程序可能并非在运行您的代码的所有系统上都可用。因此,您会降低程序的可移植性。
    • 生成新的子 shell 以运行外部程序比仅在当前环境中执行工作要慢得多。
    • 您从外部程序返回的值可能带有换行符。而且您可能会忘记删除它。

    这是最后一个在这里燃烧你。但其他的也同样适用。

    多年来,Perl 的标准库一直包含 File::Temp 模块,该模块无需使用外部程序即可为您创建临时文件。

    use File::Temp qw/ tempfile /;
    
    # It even opens it and gives you the filehandle.
    ($fh, $filename) = tempfile();
    

    【讨论】:

      猜你喜欢
      • 2014-09-03
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      相关资源
      最近更新 更多