【问题标题】:Handling and generating files in Perl code在 Perl 代码中处理和生成文件
【发布时间】:2014-04-16 19:57:16
【问题描述】:

我有 perl 代码(称为aggregator.pl),它通过命令从名为“testdata.csv”的文件中读取一些数据

open (F,'testdata.csv');  
my @lines=<F>;    
close(F);

为输出打开一个新的文件句柄

open (F1,'>>testdata_aggregates.csv');

并将一些计算的结果附加到此输出文件“testdata_aggregates.csv”。

要启动我的 perl 代码,我只需输入命令提示符:

$ perl aggregator.pl

现在,我有不同的数据文件,称为 20100909.csv20100910.csv应该使用(比如,'20100909.csv')并且他应该相应地命名输出文件(比如'20100909_aggregates.csv',基本上,在输入文件名中添加_aggregates)。

关于如何更改我的代码以及如何启动新代码并添加他应该使用的 data_input 文件的名称的任何建议?

【问题讨论】:

    标签: perl file filenames


    【解决方案1】:

    只需通过@ARGV 接受参数即可。

    您的脚本应该打开:

    use strict;
    use warnings;
    use autodie;
    
    die "Usage: $0 Input_File Output_File\n" if @ARGV != 2;
    
    my ($infile, $outfile) = @ARGV;
    

    稍后在您的文件中

    open (F, '<', $infile);
    
    # ...
    
    open (F1,'>>', $outfile);
    

    【讨论】:

    • 哇,这很简单!我不知道 Perl 中的这个 @ARGV 命令/函数。两个答案都很棒,但我会选择这个。谢谢!
    • @g_puffo - ARGV 是一个变量。它在perlvar
    • 另一个答案要灵活得多。
    【解决方案2】:

    人们通常会重写这样的应用程序,它从 STDIN 读取并简单地写入 STDOUT。然后在命令行上调用程序时,可以使用重定向运算符来指定文件:

    $ perl aggregator.pl <testdata.csv > testdata_aggregates.csv
    $ perl aggregator.pl <20100909.csv > 20100909_aggregates.csv
    ...
    

    脚本内部发生了哪些变化?我们不打开文件F,而是:my @lines = &lt;&gt;。我们不打印到F1,而是打印到STDOUT,这是隐式选择的:print F1 "foo\n" 变为print "foo\n"

    【讨论】:

    • 通常情况下,我也会将此作为解决方案提供。但是,考虑到他要附加到输出文件,不会冒用户忘记输入&gt;&gt; 而不是&gt; 从而破坏旧数据的风险。
    猜你喜欢
    • 2011-08-01
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2011-03-09
    相关资源
    最近更新 更多