使用Perl写入文件最简单的方法是什么?

Par*_*roX 3 perl

目前我正在使用

system("echo $panel_login $panel_password $root_name $root_pass $port $panel_type >> /home/shared/ftp");
Run Code Online (Sandbox Code Playgroud)

使用Perl做同样事情的最简单方法是什么?IE:一个单行.

Tel*_*hus 13

为什么需要一行?你没有按线付款,是吗?这可能过于冗长,但总共需要两分钟才能输入.

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

my @values = qw/user secret-password ftp-address/;

open my $fh, '>>', 'ftp-stuff'          # Three argument form of open; lexical filehandle
  or die "Can't open [ftp-stuff]: $!";  # Always check that the open call worked

print $fh "@values\n";     # Quote the array and you get spaces between items for free

close $fh or die "Can't close [ftp-stuff]: $!";
Run Code Online (Sandbox Code Playgroud)

  • 什么,不检查打印是否成功(笑)?说真的,autodie pragma(虽然不是Perl核心的一部分),无需显式检查打开和关闭的返回值:http://search.cpan.org/dist/autodie/lib/autodie.pm (3认同)

Cha*_*ens 8

您可能会发现IO :: All有用:

use IO::All;
#stuff happens to set the variables
io("/home/shared/ftp")->write("$panel_login $panel_password $root_name $root_pass $port $panel_type");
Run Code Online (Sandbox Code Playgroud)

  • 即使是金钱也说这会引起OP的疑惑,"为什么我会得到这个错误?" - 未定义的子程序&main :: io在脚本名称行调用.仍然是+1为一行. (2认同)

Tom*_*Tom 6

编辑(根据流行和可编辑的需求)

http://perldoc.perl.org/functions/open.html

在您的情况下,您必须:

  #21st century perl.
  my $handle;
  open ($handle,'>>','/home/shared/ftp') or die("Cant open /home/shared/ftp");
  print $handle "$panel_login $panel_password $root_name $root_pass $port $panel_type";
  close ($handle) or die ("Unable to close /home/shared/ftp");
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用autodie pragma(如@Chas Owens 在评论中建议的那样)。这样,就不需要使用检查 (the or die(...)) 部分。

希望这次能做对。如果是这样,将清除此警告。

旧的弃用方式

使用打印(虽然不是一个衬垫)。只需先打开您的文件并获取句柄。

open (MYFILE,'>>/home/shared/ftp');
print MYFILE "$panel_login $panel_password $root_name $root_pass $port $panel_type";
close (MYFILE);
Run Code Online (Sandbox Code Playgroud)

http://perl.about.com/od/perltutorials/a/readwritefiles_2.htm

  • 如果您要告诉人们 open 函数不要使用 2000 年之前的样式,请使用 open 和词法文件句柄的三参数版本。为了理智起见,请检查返回代码(或使用 autodie 编译指示):打开我的 $fh, ">>", "/home/shared/ftp" 或 die "could not open /home/shared/ftp: $!"; 打印 {$fh} “等等”;关闭 $fh 或死“无法关闭 /home/shared/ftp: $!”; (15认同)
  • @Nathan Fellman 不,错误检查总是很重要的。大多数人只是复制和粘贴代码,只更改变量名称。 (3认同)
  • @Chas,我认为实际上没有必要检查诸如此类的示例代码中的错误。诸如“#跳过错误检查,因为它是一个示例”之类的注释就足够了。错误检查虽然很重要,但会混淆答案中更重要的部分,也就是实际的解决方案。 (2认同)
  • @Brian 除了 kevinadc 指出的文档之外,裸字文件句柄是全局范围的,因为词法文件句柄只存在于它们声明的范围内。它们也更容易传递给函数并在超出范围时关闭自己。open 和bareword 文件句柄的两个参数版本是错误,只是为了向后兼容而留在语言中。它们在 Perl 5.6(大约 2000 年)中被替换,但由于存在所有示例代码,人们仍然错误地使用旧的。 (2认同)

Mat*_*ley 6

(open my $FH, ">", "${filename}" and print $FH "Hello World" and close $FH) 
    or die ("Couldn't output to file: ${filename}: $!\n");
Run Code Online (Sandbox Code Playgroud)

当然,不可能在单行代码中进行正确的错误检查......这应该写得略有不同:

open my $FH, ">", "${filename}" or die("Can't open file: ${filename}: $!\n");
print $FH "Hello World";
close $FH;
Run Code Online (Sandbox Code Playgroud)

  • 你的代码让我认为你没有使用严格的编译指示($FH 前面缺少 my 是提示),你应该使用 open 的三参数版本,而不是危险的两参数版本。如果 $filename 是 ">foo" 会发生什么? (2认同)

Yon*_*oza 5

您可能想要使用简单的File :: Slurp模块:

use File::Slurp;

append_file("/home/shared/ftp",
    "$panel_login $panel_password $root_name $root_pass ".
    "$port $panel_type\n");
Run Code Online (Sandbox Code Playgroud)

它不是核心模块,所以你必须安装它.

  • Brian正在追加他的文件,而不是覆盖它,所以应该使用`append_file`而不是`write_file`.但仍然,File :: Slurp ftw. (2认同)