基本上,这是我编程的结果,并在过去半小时内使用 Google 试图实现一个简单的事情:从 STDIN
获取用户输入并将它们写入结构化的 XML 文件作为输出。下面是我丑陋的代码:
#!/bin/perl
print "img URL = ? ";
$img = <>;
chomp($img);
print "filename = ? ";
$filename = <>;
chomp($filename);
# now write xml with inserted contents to a file:
open (CARDFILE, ">>$filename");
print CARDFILE "<card>\r\n";
print CARDFILE " <img>$img</img>\r\n";
print CARDFILE " <type>$type</type>\r\n";
print CARDFILE " <expansion>$expansion</expansion>\r\n";
print CARDFILE " <keyword>$keyword</keyword>\r\n";
print CARDFILE " <color>$color</color>\r\n";
print CARDFILE " <linkcolor>$linkcolor</linkcolor>\r\n";
print CARDFILE " <kickercolor>$kickercolor</kickercolor>\r\n";
print CARDFILE " <cost>$cost</cost>\r\n";
print CARDFILE " <strength>$strength</strength>\r\n";
print CARDFILE " <health>$health</health>\r\n";
print CARDFILE "</card>";
close (CARDFILE);
我是 Perl 的新手,但我可以说出代码中的一些重大问题:STDIN
然后 chomp()
它摆脱尾随回车。应该有单行吗?CARDFILE
文件句柄,我可以使用 here-doc 语法将所有字符串打印到 STDOUT
在单个打印语句中。现在我必须多次调用打印函数。"\r\n"
s,有没有办法使用不同的功能,所以我不必记住在每行之后手动插入它们?最佳答案
读一行
阅读一行的习惯用法是
chomp(my $var = <>);
但我通常最终会写一个小
prompt
子程序:sub prompt {
print @_;
chomp(my $answer = <>);
return $answer;
}
...;
my $img = prompt("img URL = ? ");
Here-docs
here-doc 只是另一种字符串文字,例如
my $str = <<"END";
foo bar
baz
END
print $str;
如果用单引号将分隔符括起来:
<<'END'
,那么您不能将变量插入到 here-doc 中。请注意,结束标记必须始终位于行首,但可以包含空格字符: my $string = <<'END THIS';
foo
bar
END THIS
# marker must be at start of line!
您可以直接打印 here-doc 之类的
print CARDFILE <<"END";
<card>
<img>$img</img>
<type>$type</type>
<expansion>$expansion</expansion>
<keyword>$keyword</keyword>
<color>$color</color>
<linkcolor>$linkcolor</linkcolor>
<kickercolor>$kickercolor</kickercolor>
<cost>$cost</cost>
<strength>$strength</strength>
<health>$health</health>
</card>
END
不同的是这里不会有
\r\n
在行尾,除非您使用 Windows 行结尾保存源文件。但是,here-doc 确实包含物理换行符,并且总是以换行符结尾。打印东西
print
函数打印由 $,
分隔的参数特殊变量,然后输出$\
多变的。默认情况下,这两个都是空的。但是我们可以提供一个临时值:local $\ = "123";
print "foo";
输出:
foo123
当然,我们通常会设置为
\n
.但是有一个捷径:只要放一个 use feature 'say'
或 use 5.010
(或更高)在源代码的开头,然后您可以say "foo";
它会自动附加一个换行符。
打开文件句柄
使用词法变量。使用三参数打开。进行适当的错误处理。这意味着:
use autodie;
open my $fh, "<", "filename";
或者
my $filename = "filename";
open my $fh, "<", $filename or die "Can't open $filename: $!";
第二个参数是模式,即
>>
用于附加。明确指定它更安全,而不是作为文件名的一部分。一般说明
永远
use strict; use warnings;
在脚本的顶部,这有助于发现问题。
关于perl - 如何使用 "here-doc"将行打印到文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17479354/