Может быть бегущей многострочной "" строкой, начинающейся - PullRequest
1 голос
/ 19 мая 2011

синтаксическая ошибка в строке 54 HTMLmaker.pl, рядом с ". If" (Может быть бегущей многострочной "" строкой, начинающейся со строки 47) Выполнение HTMLmaker.pl прервано из-за ошибок компиляции.

 use strict;
use warnings;
use vars qw( $fc $sc $fontsize );

print "What would you like the title of the website to be? ";
chomp (my $TWT = <STDIN>);
print "What would you like as the background colour?
It will be a gradient, enter your top colour ";
chomp (my $firstecolour = <STDIN>);
print "Choose your second colour ";
chomp (my $secondcolour = <STDIN>);
print "How large would you like the text to be, 6 = smallest, 1 = largest ";
chomp (my $size = <STDIN>);
print "What text would you your heading to be? ";
chomp (my $text = <STDIN>);
print "What size would you like your font?";
chomp (my $fontsize = <STDIN>);
print "What font would you like?";
chomp (my $category = <STDIN>);
print "What colour would like your text to be?";
chomp (my $col = <STDIN>);
print "What would you like to put as tour first paragraph?";
chomp (my $txt = <STDIN>);
print "Would you like your text aligned in the center?";
chomp (my $ali = <STDIN>);
if ($firstecolour eq "black") { $fc = "#000000" };
if ($firstecolour eq "red") { $fc = "#FF0000" };
if ($firstecolour eq "green") { $fc = "#00FF00" };
if ($firstecolour eq "blue") { $fc = "#0000FF" };
if ($firstecolour eq "yellow") { $fc = "#FFFF00" };
if ($firstecolour eq "cyan") { $fc = "#00FFFF" };
if ($firstecolour eq "pink") { $fc = "#FF00FF" };
if ($firstecolour eq "grey") { $fc = "#C0C0C0" };
if ($firstecolour eq "white") { $fc = "#FFFFFF" };
if ($secondcolour eq "black") { $sc = "#000000" };
if ($secondcolour eq "red") { $sc = "#FF0000" };
if ($secondcolour eq "green") { $sc = "#00FF00" };
if ($secondcolour eq "blue") { $sc = "#0000FF" };
if ($secondcolour eq "yellow") { $sc = "#FFFF00" };
if ($secondcolour eq "cyan") { $sc = "#00FFFF" };
if ($secondcolour eq "pink") { $sc = "#FF00FF" };
if ($secondcolour eq "grey") { $sc = "#C0C0C0" };
if ($secondcolour eq "white") { $sc = "#FFFFFF" };

my $filename = "./index.htm";
open (LOG, ">>$filename") or die $!;
print LOG "<html>
<title>$TWT</title>
<body style=\"height: 800px; width: 1247px; filter:progid:DXImageTransform.Microsoft.Gradient(endColorstr=\'$sc\', startColorstr=\'$fc\', gradientType=\'0\');\">
<DIV ALIGN=CENTER>
<h$size>$text</h>
</DIV>
<font size=\"$fontsize\" face=\"$category\" color=\"$col\">
". if ($ali eq "yes") { print "<DIV ALIGN=CENTER>"}; ."
<p>$txt</p></font>
". if ($ali eq "yes") { print "</DIV>"}; ."
</body>
</html>";
close (LOG);
<STDIN>;

Что с этим не так, пожалуйста?

Ответы [ 3 ]

5 голосов
/ 19 мая 2011

Оператор if в Perl не может быть частью выражения, это отдельная конструкция. Если вы хотите поместить его в выражение, оно должно быть заключено в блок do {...}.

Встроенным эквивалентом является конструкция COND ? EXPR1 : EXPR2, аналогичная do {if (COND) {EXPR1} else {EXPR2}}.

Вы должны использовать лексические переменные, объявленные с my вместо use vars прагмы.

Ваш код также содержит много повторений. Perl очень хорошо позволяет вам устранить это, что экономит время, упрощает рефакторинг и сокращает количество ошибок.

Например, сопоставление имен цветов с шестнадцатеричными кодами должно выполняться с помощью хеш-таблицы. Аналогично, установка многих переменных после запроса пользователя может быть записана в виде цикла.

Вот краткий пример того, что я имею в виду:

my @questions = (
    [\my $TWT           => "What would you like the title of the website to be? "],
    [\my $firstecolour  => "What would you like as the background colour?\nIt will be a gradient, enter your top colour: "],
    [\my $secondcolour  => "Choose your second colour: "],
);

for (@questions) {
    print $$_[1];
    chomp (${$$_[0]} = <STDIN>)
}

my %colors = do {
    no warnings 'qw';
    qw(
        black   #000000
        red     #FF0000
        green   #00FF00
        blue    #0000FF
        yellow  #FFFF00
        cyan    #00FFFF
        pink    #FF00FF
        grey    #C0C0C0
        white   #FFFFFF
    )
};

for ($firstecolour, $secondcolour) {
    if ($colors{lc $_}) {
        $_ = $colors{lc $_}
    }
}

say for $firstecolour, $secondcolour;
2 голосов
/ 20 мая 2011

У вас есть инструкция печати в середине строкового выражения. Это неправильно по двум причинам:

  • В Perl нельзя напрямую встроить инструкцию (приказ сделать что-то) в выражение (описание того, как создать значение).
  • Инструкция печати print "<DIV ALIGN=CENTER>" будет печатать этот текст на стандартный вывод, не включая его в то, что вы печатаете на LOG.

Проблемная часть вашего кода:

print LOG "<html> …
". if ($ali eq "yes") { print "<DIV ALIGN=CENTER>"}; ."
… </html>";

if нельзя использовать в выражении, но вместо этого можно использовать условный оператор condition ? if_true : if_false.

print LOG "<html> …
" . ($ali eq "yes" ? "<DIV ALIGN=CENTER>" : "") . "
… </html>";

Еще одна особенность Perl, которая будет полезна в этой части кода, - это синтаксис «here-document» . Это более простой способ написания многострочных строк. Вы помещаете <<EOF заполнитель в качестве аргумента для print, и все строки до одной строки, содержащей EOF, становятся одной длинной строкой. @{[…]} идиома для помещения выражения переменной немного сложнее объяснить; если вас это беспокоит, заранее поместите части переменных в переменные и просто используйте эти переменные.

print LOG <<EOF;
<html> …
@{[$ali eq "yes" ? "<DIV ALIGN=CENTER>" : ""]}
<p>$txt</p></font>
@{[$ali eq "yes" ? "</DIV>" : ""]}
… </html>
EOF

или

my $ali_start = ($ali eq "yes" ? "<DIV ALIGN=CENTER>\n" : "");
my $ali_end = ($ali eq "yes" ? "</DIV>\n" : "");
print LOG <<EOF;
<html> …
$ali_start<p>$txt</p></font>$ali_end
… </html>
EOF

Следуйте совету Эрика Строма и по общему стилю Perl.

2 голосов
/ 19 мая 2011

Вы не можете вставить свое заявление if, как вы это сделали.
". if ($ali eq "yes") { print "…"}; ."…"; close (LOG); ;
==>

";
if ($ali eq "yes") { print LOG "…"};
print LOG "…";
close (LOG);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...