简体   繁体   English

如何通过Perl打开和编辑文件?

[英]How can I open and edit files through Perl?

I want to give the user input (multi-line) and print the multi-line output to a new file named by the user with 我想给用户输入(多行)并将多行输出打印到用户命名的新文件中,

I've already tried 我已经尝试过了

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

but that only works with one line. 但这仅适用于一行。

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

but multi-line and creates a new file, not edits an old one 但多行并创建一个新文件,而不编辑旧文件

It either doesn't create a file, doesn't edit a file, or just doesn't do anything at all. 它要么不创建文件,不编辑文件,要么什么都不做。

To type out a new file or add lines to an existing one 键入一个新文件或向现有文件添加行

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;
}

Note that the actual writing of user's input can be written simply as 注意,用户输入的实际书写可以简单地写成

 print $fh $_ while <STDIN>;

All the rest is management of user input, checking etc. That can be organized in many ways, depending on details of possible uses. 剩下的就是对用户输入,检查等的管理。可以根据可能的使用细节以多种方式进行组织。 The above is a simple take, please change and tweak as suitable. 以上是简单的说明,请根据需要进行更改和调整。

Here is an example that lets you exit the loop by pressing CTRL-C: 这是一个示例,可让您通过按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'";
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM