Perl读取每一行并在电子邮件(html)中打印输出

Perl读取每一行并在电子邮件(html)中打印输出,html,perl,Html,Perl,下面的代码能够读取文件的内容,并用文件的内容打印正文的内容 use strict; my $filename = '.../text.txt'; open (my $ifh, '<', $filename) or die "Could not open file '$filename' $!"; local $/ = undef; my @row = (<$ifh>)[0..9]; close ($ifh); print "@row\n"; my ($body)

下面的代码能够读取文件的内容,并用文件的内容打印正文的内容

use strict;     
my $filename = '.../text.txt';
open (my $ifh, '<', $filename)
or die "Could not open file '$filename' $!";
local $/ = undef;
my @row = (<$ifh>)[0..9];
close ($ifh);
print  "@row\n";

my ($body) = @_;
my ($html_body)= @_;
.
.
.
print(MAIL "Subject: Important Announcement \n");
.
.
.
push(@$html_body, "<h1><b><font color= red ><u>ATTENTION!</u></b></h1></font><br>");
 push(@$html_body, "@row");
.
.
.
 print(MAIL "$body", "@$html_body");
 close(MAIL);
使用严格;
我的$filename='…/text.txt';

open(my$ifh,首先,
@
是传递给子例程的参数数组,看起来您不在其中。因此,执行以下操作:

my ($body) = @_;
my ($html_body) = @_;
正在将
$body
$html\u body
设置为
$\u0]
,即
undef

如何修复


如果将其包装到子例程中,有两种方法:

使用
shift
->,这将使上述代码看起来像:

my ($body) = shift;
my ($html_body)= shift;
或者


我建议使用最后一种,因为它比第一种代码少,可读性更高。

您面临的问题是,当将纯文本放在HTML文档中时,它不包含任何格式信息。行尾字符会被忽略,并像普通空格一样处理。您需要在文本中添加HTML标记以传达您可以选择您想要的格式,也可以将其包装在一个预标记中,这样将显示“原样”

正如其他人在上面的评论中提到的,你使用
@
没有意义。而且当你所做的只是将html附加到
$html\u body
中时,将其视为数组也没有意义。因此,我重写了这段代码,将其作为标量使用,并将html附加到其中。此外,还修复了这一问题HTML中存在一些错误,因为您需要按照打开标签的相同顺序关闭标签

print MAIL "Subject: Important Announcement \n";
print MAIL "\n"; # Need a blank line after the header to show it's finished
my $html_body = "<html><body>";
$html_body .=  "<h1><b><font color="red"><u>ATTENTION!</u></font></b></h1>";
$html_body .= "<pre>";
$html_body .= join("", @row);
$html_body .= "</pre>";
$html_body .= "</body></html>";
print MAIL $html_body;
close(MAIL);
打印邮件“主题:重要公告\n”;
打印邮件“\n”#页眉后需要一个空行以显示邮件已完成
我的$html_body=“”;
$html_body.=“注意!”;
$html_body.=“”;
$html_body.=join(“,@行);
$html_body.=“”;
$html_body.=“”;
打印邮件$html\u正文;
关闭(邮件);

不清楚
$body
$html\u body
变量应该从什么开始。您正在将函数的第一个参数分配给这两个变量。但看起来您不在函数中。$body和$htnl\u body分配给列表,在其中将生成电子邮件。不。您的代码充满了错误。您认为呢你认为
@
是为了?在
push(@$html\u body,“@row”);
中,你在串化
@row
。这本质上与
push@$html\u body,join($,@row)相同
。我不认为这是你的意思。除了在
@
中没有任何内容,因为没有子例程。哦,谢谢你指出。将相应地更新答案。效果很好…非常感谢@ChrisTurner@SharmilaSubramaniam如果您接受这个答案,请打勾:)
print MAIL "Subject: Important Announcement \n";
print MAIL "\n"; # Need a blank line after the header to show it's finished
my $html_body = "<html><body>";
$html_body .=  "<h1><b><font color="red"><u>ATTENTION!</u></font></b></h1>";
$html_body .= "<pre>";
$html_body .= join("", @row);
$html_body .= "</pre>";
$html_body .= "</body></html>";
print MAIL $html_body;
close(MAIL);