perl - 如何使用 "here-doc"将行打印到文件?

标签 perl

基本上,这是我编程的结果,并在过去半小时内使用 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()它摆脱尾随回车。应该有单行吗?
  • 我无法弄清楚如何使用“here-doc”来一次性打印多行文件。没有 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/

    相关文章:

    perl - 当我访问 twitter 时 OAuth::Lite::Consumer 超时

    Perl 哈希、数组和引用

    perl - 在perl中解码unicode JSON的问题

    perl - perl 中括号/括号的使用规则 (?)

    regex - (s)printf FORMAT 字符串的权威正则表达式

    perl - 解析时我没有得到 HTML 标签

    mysql - 流错误,同时尝试在 Compress::Raw::Zlib::_deflateInit 中初始化 deflate 对象

    html - 如何使用 Web::Scraper 解析此 HTML?

    mysql:如何转义perl字符串中的括号

    perl - 命令历史记录箭头键在命令提示符 Windows 中不起作用