【问题标题】:How can I open and edit files through Perl?如何通过 Perl 打开和编辑文件?
【发布时间】:2019-07-13 16:21:36
【问题描述】:

我想给用户输入(多行)并将多行输出打印到用户命名的新文件中

我已经试过了

say "enter filename";
chomp(my $filename = <STDIN>);
open my $fn, '>', $filename;
say "enter contents";
print "> ";
chomp(my $contents = <STDIN>);
print {$fn} $contents;
close $fn;

但这只适用于一行。

say "enter filename";
chomp(my $filename = <STDIN>);
open my $fn, '>', $filename;
say "enter contents";
print "> ";
chomp(my $contents = <STDIN>);
print {$fn} $contents;
close $fn;

但多行并创建一个新文件,而不是编辑旧文件

它要么不创建文件,不编辑文件,要么根本不做任何事情。

【问题讨论】:

  • 请注意,您的两个 sn-ps 是相同的。也许删除一个以避免混淆? “多行”是什么意思? “编辑文件”是什么意思?
  • 我的意思是让用户可以通过 Perl 编辑文件,并在输出中包含多于 1 行。
  • 很抱歉这么难理解._.
  • 您的意思是说print {$fn} $contents,而不是print {$filename} $contents$filename 是一个字符串,但 $fn 是文件句柄。
  • 看看What should I do when someone answers my question? 我还建议您查看您之前的问题并投票并接受您认为合适的问题

标签: file perl editing


【解决方案1】:

键入新文件或在现有文件中添加行

use warnings;
use strict;
use feature 'say';

my $filename = shift;  # Better use a module (eg. Getopt::Long)

if (not $filename) { 
    $filename = get_filename();
}
elsif (-f $filename) {
    say "Appending to file \"$filename\".";
}
elsif (-e $filename and not -f $filename) {
    say "The \"$filename\" exists but is not a plain file.";
    $filename = get_filename();
}
else {
    say "Creating file \"$filename\"";
}

open my $fh, '>>', $filename or die "Can't open $filename: $!";
say "\nEnter lines to add. Press Ctrl-D when done.\n";

print ">  ";
while (my $line = <STDIN>) {
    print $fh $line;
    print ">  ";
}  

sub get_filename {
    print "Enter the name for a file to create/edit:  ";
    chomp (my $filename = <STDIN>);
    while (-e $filename and not -f $filename) { 
        say "The \"$filename\" exists but is not a plain file.";
        print "Enter the name for a file to create/edit:  ";
        chomp ($filename = <STDIN>);
    }   
    usage() if not $filename;
    return $filename;
}
sub usage { 
    say STDERR "Usage: $0 [filename]";
    exit;
}

注意,用户输入的实际写法可以简单地写成

 print $fh $_ while <STDIN>;

剩下的就是管理用户输入、检查等。这可以通过多种方式组织,具体取决于可能使用的细节。以上是一个简单的拍摄,请酌情更改和调整。

【讨论】:

  • 非常感谢!你是我的救星,@zdim。
  • @MrMister 好吧,我很高兴你喜欢它 :)。我进行了编辑,使 sub 更加健壮。
  • 如果这解决了您的问题,请将其标记为已接受。另见help.
  • @MrMister - 你应该考虑accepting this answer
【解决方案2】:

这是一个让您可以通过按 CTRL-C 退出循环的示例:

use feature qw(say);
use strict;
use warnings;

STDOUT->autoflush(1);
say "enter filename";
chomp(my $filename = <STDIN>);
open my $fh, '>', $filename or die "Could not open file '$filename': $!";
{
    local $SIG{INT} = sub { die "SIGINT" };
    say "enter contents (CTRL-C to exit)";
    eval {
        while (1) {
            print "> ";
            my $contents = <STDIN>;  # do not need chomp here
            print $fh $contents;
        }
    };
    close $fh;
    say "\nDone. Saved file '$filename'";
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 2014-04-10
    • 1970-01-01
    • 2011-09-25
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多