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

什么';使用Perl写入文件的最简单方法是什么?,perl,Perl,目前我正在使用 system("echo $panel_login $panel_password $root_name $root_pass $port $panel_type >> /home/shared/ftp"); 使用Perl做同样事情的最简单方法是什么?IE:一行。编辑(根据流行和可编辑的需求) 在您的情况下,您必须: #21st century perl. my $handle; open ($handle,'>>','/home/shar

目前我正在使用

system("echo $panel_login $panel_password $root_name $root_pass $port $panel_type >> /home/shared/ftp");
使用Perl做同样事情的最简单方法是什么?IE:一行。

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

在您的情况下,您必须:

  #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");
或者,您可以使用(正如@Chas Owens在评论中建议的那样)。 这样,无需使用止回阀(或模具(…)零件)

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

老路 使用打印(但不是一行)。只需在之前打开文件并获取句柄

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

您可能会发现:

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");
当然,在一行程序中进行正确的错误检查是不可能的。。。这应该写得稍微不同:

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

为什么它必须是一行?你不是在排队付账吧?这可能太冗长了,但总共花了两分钟才打印出来

#!/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]: $!";

对于这样的高级单行程序,您还可以使用一个简单的纯Perl shell中的psh命令

 psh -c '{my $var = "something"; print $var} >/tmp/out.txt'

关于使用perl编辑文件的一些好读物:


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

use File::Slurp;

append_file("/home/shared/ftp",
    "$panel_login $panel_password $root_name $root_pass ".
    "$port $panel_type\n");
但它不是核心模块,所以您必须安装它。

我使用。从POD中:

use FileHandle;
$fh = new FileHandle ">> FOO"; # modified slightly from the POD, to append
if (defined $fh) {
    print $fh "bar\n";
    $fh->close;
}
如果您想要更接近“一行线”,可以这样做:

use FileHandle;
my $fh = FileHandle->new( '>> FOO' ) || die $!;
$fh->print( "bar\n" );
## $fh closes when it goes out of scope

你可以做这样的一行:

print "$panel_login $panel_password $root_name $root_pass $port $panel_type" >> io('/home/shared/ftp');
只需将IO::All模块添加到代码中,如下所示:

use IO::All;

甚至连money都说这会让OP想,“为什么我会出现这个错误?”-在脚本名行调用了未定义的子例程&main::io。尽管如此,+1代表一行。重点是,我假设人们知道他们必须使用模块。如果你想告诉人们关于开放函数的内容,不要使用2000年以前的样式,请使用开放和词汇文件句柄的三参数版本。为了理智起见,请检查返回代码(或使用autodie pragma):打开我的$fh、“>>”、“/home/shared/ftp”或“无法打开/home/shared/ftp:$!”;打印{$fh}“废话”;关闭$fh或死亡“无法关闭/home/shared/ftp:$!”@Brian-来自perlopentut-还有一个3参数版本的open,它允许您将特殊的重定向字符放入它们自己的参数中:open(信息“>”,$datafile)| die“无法创建$datafile:$!”;在本例中,要打开的文件名是$datafile中的实际字符串,因此您不必担心$datafile中包含可能影响打开模式的字符,也不必担心文件名开头的空白会被双参数版本吸收。另外,减少不必要的字符串插值也是一件好事。@Chas,我认为实际上没有必要检查像这样的示例代码中的错误。诸如“#跳过错误检查,因为这是一个示例”之类的注释应该足够了。错误检查虽然很重要,但却把答案中更重要的部分弄乱了,这才是真正的解决办法。@Nathan Fellman不,错误检查总是很重要的。大多数人只是复制和粘贴代码,只更改变量名。@Brian除了kevinadc指出的文档外,裸字文件句柄是全局范围的,而词汇文件句柄只存在于声明它们的范围内。它们也更容易传递给函数,并在超出范围时自行关闭。OpenFileHandles和BarewordFileHandles的两个参数版本都是错误,这些错误只留在语言中用于向后兼容。它们在Perl 5.6(大约2000年)中被替换,但由于所有的示例代码,人们仍然错误地使用旧版本。您的代码让我觉得您没有使用严格的pragma(在$FH前面缺少my是提示),您应该使用open的三参数版本,而不是危险的两参数版本。如果$filename是“>foo”会发生什么?我通常使用strict,但这是一个我甚至没有运行perl的快速示例,如果他知道足够多的知识来使用strict,但不知道如何修复此代码将抛出的警告,那么他会遇到比简单地写入文件更多的问题。至于文件名。。。我已经有一段时间没有写过认真的Perl了,但是哦,好吧。说得好。什么,不检查打印是否成功(咧嘴笑)?说真的,autodie pragma(虽然不是Perl核心的一部分)消除了显式检查open和close:Yup的返回值的需要,我已经开始在自己的代码中使用它。我不记得了,但我正在努力。但在代码中,有人问“我怎样才能打印到一个文件?”我想这是一个小步骤。模块是以后的建议。Brian将附加到他的文件中,而不是覆盖它,因此应该使用
append\u file
而不是
write\u file
。但是,File::Slurp ftw.更改为append_File并添加了一行新行。谢谢Dave。(文件句柄->新建('>>FOO')| | die$!)->打印(“bar\n”):-D
use IO::All;