Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 为什么在使用模板的FOREACH循环中会出现错误?_Perl_Templates_Template Toolkit - Fatal编程技术网

Perl 为什么在使用模板的FOREACH循环中会出现错误?

Perl 为什么在使用模板的FOREACH循环中会出现错误?,perl,templates,template-toolkit,Perl,Templates,Template Toolkit,我需要帮助解决这个问题,我在过去15天里一直在挣扎,请帮助我。我有一个xml文件,我使用xml::simple存储在一个变量中。我通过模板工具包处理。我犯了这样的错误 $var1={ university=>{ 'name'=>'svu', 'location'=>'ravru', 'branch'=>{ 'electronics'=>{

我需要帮助解决这个问题,我在过去15天里一直在挣扎,请帮助我。我有一个xml文件,我使用xml::simple存储在一个变量中。我通过模板工具包处理。我犯了这样的错误

$var1={
 university=>{
      'name'=>'svu',
       'location'=>'ravru',
        'branch'=>{
                 'electronics'=>{
                            'student'=>[
                                     {
                                    'name'=>'mikky',
                                     'number'=>'12',
                                       'semester'=>{
                                              'Number'=>'1',
                                              'subjects'=>'7',
                                               'rank'=>'1'
                                              }
                                           },
                                   {
                                    'name'=>'vijju',
                                     'number'=>'15',
                                       'semester'=>[
                                            {
                                           'number'=>'1',
                                            'subjects'=>'7',
                                             'rank'=>'10'
                                              },
                                             {
                                            'number'=>'1',
                                            'subjects'=>'7',
                                             'rank'=>'1'
                                              }
                                             ]
                                           },
                                          {
                                    'name'=>'shyam',
                                     'number'=>'16',
                                       'semester'=>[
                                            {
                                           'number'=>'1',
                                            'subjects'=>'7',
                                             'rank'=>'2'
                                              },
                                             {
                                            'number'=>'2',
                                            'subjects'=>'4',
                                             'rank'=>'2'
                                              }
                                             ]
                                           }
                                         }
                                      ]
                                     }
                                   };
           university=>{
                 'name'=>'sku',
                'location'=>'ANTP',
                  'branch'=>{
                        'electronics'=>{
                                  'student'=>[
                                            {
                                          'name'=>'xxx',
                                           'number'=>'12',
                                          'semester'=>{
                                                  'Number'=>'3',
                                                    'subjects'=>'6',
                                                  'rank'=>'20'
                                              }
                                           },
                                   {
                                    'name'=>'xxx',
                                     'number'=>'6',
                                       'semester'=>[
                                            {
                                           'number'=>'1',
                                            'subjects'=>'9',
                                             'rank'=>'12'
                                              },
                                             {
                                            'number'=>'2',
                                            'subjects'=>'4',
                                             'rank'=>'2'
                                              }
                                             ]
                                           }
                                         }
                                      ]
                                     }
                                   };
      'studentaddres'=>{
                 'address'=>[
                            {
                           'name'=>'mikky',
                           'number'=>'12',
                           'adress'=>' badvel,kadapa,a.p,india',
                            },

                           {
                           'name'=>'vijju',
                           'number'=>'15',
                           'adress'=>' raipur,ananthapur,a.p,india',
                            },

                           {
                           'name'=>'shyam',
                           'number'=>'16',
                           'adress'=>' raighad,rajsthan,india',
                            },
                          ]
                       }
#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper; 
use XML::Simple;
use XML::Fast;
use Template;

my $xml = new XML::Simple;
my $data = $xml->XMLin("data.xml");
print Dumper($data);
my $template = Template->new();
my $filename = 'output.tex';
$template->process(\*DATA, $data, $filename)
    || die "Template process failed: ", $template->error(), "\n";

system( "pdflatex $filename" );
__DATA__
\documentclass[a4paper,leqno,twoside]{article}
\begin{document}

[% FOREACH st IN university %]
[% st.name %] 
[%st.location%]
studentdata:
[% FOREACH student IN st.branch.electronics.student %]
Component type: [%+ student.name +%][%+ student.number +%]
[% FOREACH semester IN student.semester %]
[%+ semester.number +%]
[%+ semester.subjects +%]
[%+  semester.rank +%]
[% END %]
[% END %]
[% END %]

\end{document}
name:
      svu
location: 
      ravru
student data:
   student name=xxx  number=12
  semester number=1 subjects=7 rank=2
   student name=xxx  number=15
  semester number=1 subjects=7 rank=10
 semester number=2 subjects=4 rank=1
 student name=xxx  number=16
 semester number=1 subjects=7 rank=2
 semester number=2 subjects=4 rank=2

#!/usr/bin/perl
 use warnings;
 use strict;
 use Data::Dumper; 
 use XML::Simple;
 use XML::Fast;
 use Template;

 my $studentaddres;

  my $xml = new XML::Simple;
 my $data = $xml->XMLin("data.xml", ForceArray=>1);
  print Dumper($data);

 my $template = Template->new();
   my $filename = 'output.tex';
   $template->process(\*DATA, $data, $filename)
 || die "Template process failed: ", $template->error(), "\n";

 $studentaddres->{by_student_number} 
 = { map { $_->{number} => $_ } @{ $studentaddres->{address} }};

 system( "pdflatex $filename" );
  __DATA__
\documentclass[a4paper,leqno,twoside]{article}
   \begin{document}

 [% FOREACH st IN university %]
  [% st.name %] 
   [%st.location%]
  studentdata:
  [% FOREACH student IN st.branch.electronics.student %]
    Component type: [%+ student.name +%][%+ student.number +%]

  [% address = studentaddres.by_student_number.item( student.number );
  IF address %]
 [% address.adress %]
 [% END %]
 [% FOREACH semester IN student.semester %]
  [%+ semester.number +%]
   [%+ semester.subjects +%]
   [%+  semester.rank +%]
    [% END %]
   [% END %]
   [% END %]

  \end{document}
(新评论:我有这样的数据,如果我们深入研究,我在student元素和address元素中有相同的名称和编号,我在address元素中还有一个东西address。现在我需要在address元素中搜索student name和编号,并获得该学生的地址。有时我有相同的名称和不同的编号,所以我需要同时搜索号码和姓名以查找学生地址。)

我是这样处理的

$var1={
 university=>{
      'name'=>'svu',
       'location'=>'ravru',
        'branch'=>{
                 'electronics'=>{
                            'student'=>[
                                     {
                                    'name'=>'mikky',
                                     'number'=>'12',
                                       'semester'=>{
                                              'Number'=>'1',
                                              'subjects'=>'7',
                                               'rank'=>'1'
                                              }
                                           },
                                   {
                                    'name'=>'vijju',
                                     'number'=>'15',
                                       'semester'=>[
                                            {
                                           'number'=>'1',
                                            'subjects'=>'7',
                                             'rank'=>'10'
                                              },
                                             {
                                            'number'=>'1',
                                            'subjects'=>'7',
                                             'rank'=>'1'
                                              }
                                             ]
                                           },
                                          {
                                    'name'=>'shyam',
                                     'number'=>'16',
                                       'semester'=>[
                                            {
                                           'number'=>'1',
                                            'subjects'=>'7',
                                             'rank'=>'2'
                                              },
                                             {
                                            'number'=>'2',
                                            'subjects'=>'4',
                                             'rank'=>'2'
                                              }
                                             ]
                                           }
                                         }
                                      ]
                                     }
                                   };
           university=>{
                 'name'=>'sku',
                'location'=>'ANTP',
                  'branch'=>{
                        'electronics'=>{
                                  'student'=>[
                                            {
                                          'name'=>'xxx',
                                           'number'=>'12',
                                          'semester'=>{
                                                  'Number'=>'3',
                                                    'subjects'=>'6',
                                                  'rank'=>'20'
                                              }
                                           },
                                   {
                                    'name'=>'xxx',
                                     'number'=>'6',
                                       'semester'=>[
                                            {
                                           'number'=>'1',
                                            'subjects'=>'9',
                                             'rank'=>'12'
                                              },
                                             {
                                            'number'=>'2',
                                            'subjects'=>'4',
                                             'rank'=>'2'
                                              }
                                             ]
                                           }
                                         }
                                      ]
                                     }
                                   };
      'studentaddres'=>{
                 'address'=>[
                            {
                           'name'=>'mikky',
                           'number'=>'12',
                           'adress'=>' badvel,kadapa,a.p,india',
                            },

                           {
                           'name'=>'vijju',
                           'number'=>'15',
                           'adress'=>' raipur,ananthapur,a.p,india',
                            },

                           {
                           'name'=>'shyam',
                           'number'=>'16',
                           'adress'=>' raighad,rajsthan,india',
                            },
                          ]
                       }
#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper; 
use XML::Simple;
use XML::Fast;
use Template;

my $xml = new XML::Simple;
my $data = $xml->XMLin("data.xml");
print Dumper($data);
my $template = Template->new();
my $filename = 'output.tex';
$template->process(\*DATA, $data, $filename)
    || die "Template process failed: ", $template->error(), "\n";

system( "pdflatex $filename" );
__DATA__
\documentclass[a4paper,leqno,twoside]{article}
\begin{document}

[% FOREACH st IN university %]
[% st.name %] 
[%st.location%]
studentdata:
[% FOREACH student IN st.branch.electronics.student %]
Component type: [%+ student.name +%][%+ student.number +%]
[% FOREACH semester IN student.semester %]
[%+ semester.number +%]
[%+ semester.subjects +%]
[%+  semester.rank +%]
[% END %]
[% END %]
[% END %]

\end{document}
name:
      svu
location: 
      ravru
student data:
   student name=xxx  number=12
  semester number=1 subjects=7 rank=2
   student name=xxx  number=15
  semester number=1 subjects=7 rank=10
 semester number=2 subjects=4 rank=1
 student name=xxx  number=16
 semester number=1 subjects=7 rank=2
 semester number=2 subjects=4 rank=2

#!/usr/bin/perl
 use warnings;
 use strict;
 use Data::Dumper; 
 use XML::Simple;
 use XML::Fast;
 use Template;

 my $studentaddres;

  my $xml = new XML::Simple;
 my $data = $xml->XMLin("data.xml", ForceArray=>1);
  print Dumper($data);

 my $template = Template->new();
   my $filename = 'output.tex';
   $template->process(\*DATA, $data, $filename)
 || die "Template process failed: ", $template->error(), "\n";

 $studentaddres->{by_student_number} 
 = { map { $_->{number} => $_ } @{ $studentaddres->{address} }};

 system( "pdflatex $filename" );
  __DATA__
\documentclass[a4paper,leqno,twoside]{article}
   \begin{document}

 [% FOREACH st IN university %]
  [% st.name %] 
   [%st.location%]
  studentdata:
  [% FOREACH student IN st.branch.electronics.student %]
    Component type: [%+ student.name +%][%+ student.number +%]

  [% address = studentaddres.by_student_number.item( student.number );
  IF address %]
 [% address.adress %]
 [% END %]
 [% FOREACH semester IN student.semester %]
  [%+ semester.number +%]
   [%+ semester.subjects +%]
   [%+  semester.rank +%]
    [% END %]
   [% END %]
   [% END %]

  \end{document}
但我得到的是不同的输出,而不是我想要的。执行此脚本后,当我有三个或更多的电子学学生,每个学生有两个或更多学期时,我得到的是输出,然后只有我得到。否则,它会打印任何东西,只打印学生数据:三次。例如,如果我有一个学生有一个学期在大学里,在那种情况下,它不会给任何东西这样的印刷

       studentdata:
           studentdata:
            studentdata:
为什么for循环是这样执行的,我真的不明白为什么要赢for循环,但我需要这样打印

$var1={
 university=>{
      'name'=>'svu',
       'location'=>'ravru',
        'branch'=>{
                 'electronics'=>{
                            'student'=>[
                                     {
                                    'name'=>'mikky',
                                     'number'=>'12',
                                       'semester'=>{
                                              'Number'=>'1',
                                              'subjects'=>'7',
                                               'rank'=>'1'
                                              }
                                           },
                                   {
                                    'name'=>'vijju',
                                     'number'=>'15',
                                       'semester'=>[
                                            {
                                           'number'=>'1',
                                            'subjects'=>'7',
                                             'rank'=>'10'
                                              },
                                             {
                                            'number'=>'1',
                                            'subjects'=>'7',
                                             'rank'=>'1'
                                              }
                                             ]
                                           },
                                          {
                                    'name'=>'shyam',
                                     'number'=>'16',
                                       'semester'=>[
                                            {
                                           'number'=>'1',
                                            'subjects'=>'7',
                                             'rank'=>'2'
                                              },
                                             {
                                            'number'=>'2',
                                            'subjects'=>'4',
                                             'rank'=>'2'
                                              }
                                             ]
                                           }
                                         }
                                      ]
                                     }
                                   };
           university=>{
                 'name'=>'sku',
                'location'=>'ANTP',
                  'branch'=>{
                        'electronics'=>{
                                  'student'=>[
                                            {
                                          'name'=>'xxx',
                                           'number'=>'12',
                                          'semester'=>{
                                                  'Number'=>'3',
                                                    'subjects'=>'6',
                                                  'rank'=>'20'
                                              }
                                           },
                                   {
                                    'name'=>'xxx',
                                     'number'=>'6',
                                       'semester'=>[
                                            {
                                           'number'=>'1',
                                            'subjects'=>'9',
                                             'rank'=>'12'
                                              },
                                             {
                                            'number'=>'2',
                                            'subjects'=>'4',
                                             'rank'=>'2'
                                              }
                                             ]
                                           }
                                         }
                                      ]
                                     }
                                   };
      'studentaddres'=>{
                 'address'=>[
                            {
                           'name'=>'mikky',
                           'number'=>'12',
                           'adress'=>' badvel,kadapa,a.p,india',
                            },

                           {
                           'name'=>'vijju',
                           'number'=>'15',
                           'adress'=>' raipur,ananthapur,a.p,india',
                            },

                           {
                           'name'=>'shyam',
                           'number'=>'16',
                           'adress'=>' raighad,rajsthan,india',
                            },
                          ]
                       }
#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper; 
use XML::Simple;
use XML::Fast;
use Template;

my $xml = new XML::Simple;
my $data = $xml->XMLin("data.xml");
print Dumper($data);
my $template = Template->new();
my $filename = 'output.tex';
$template->process(\*DATA, $data, $filename)
    || die "Template process failed: ", $template->error(), "\n";

system( "pdflatex $filename" );
__DATA__
\documentclass[a4paper,leqno,twoside]{article}
\begin{document}

[% FOREACH st IN university %]
[% st.name %] 
[%st.location%]
studentdata:
[% FOREACH student IN st.branch.electronics.student %]
Component type: [%+ student.name +%][%+ student.number +%]
[% FOREACH semester IN student.semester %]
[%+ semester.number +%]
[%+ semester.subjects +%]
[%+  semester.rank +%]
[% END %]
[% END %]
[% END %]

\end{document}
name:
      svu
location: 
      ravru
student data:
   student name=xxx  number=12
  semester number=1 subjects=7 rank=2
   student name=xxx  number=15
  semester number=1 subjects=7 rank=10
 semester number=2 subjects=4 rank=1
 student name=xxx  number=16
 semester number=1 subjects=7 rank=2
 semester number=2 subjects=4 rank=2

#!/usr/bin/perl
 use warnings;
 use strict;
 use Data::Dumper; 
 use XML::Simple;
 use XML::Fast;
 use Template;

 my $studentaddres;

  my $xml = new XML::Simple;
 my $data = $xml->XMLin("data.xml", ForceArray=>1);
  print Dumper($data);

 my $template = Template->new();
   my $filename = 'output.tex';
   $template->process(\*DATA, $data, $filename)
 || die "Template process failed: ", $template->error(), "\n";

 $studentaddres->{by_student_number} 
 = { map { $_->{number} => $_ } @{ $studentaddres->{address} }};

 system( "pdflatex $filename" );
  __DATA__
\documentclass[a4paper,leqno,twoside]{article}
   \begin{document}

 [% FOREACH st IN university %]
  [% st.name %] 
   [%st.location%]
  studentdata:
  [% FOREACH student IN st.branch.electronics.student %]
    Component type: [%+ student.name +%][%+ student.number +%]

  [% address = studentaddres.by_student_number.item( student.number );
  IF address %]
 [% address.adress %]
 [% END %]
 [% FOREACH semester IN student.semester %]
  [%+ semester.number +%]
   [%+ semester.subjects +%]
   [%+  semester.rank +%]
    [% END %]
   [% END %]
   [% END %]

  \end{document}

首先,您的数据不是有效的perl。其次,通过散列迭代会得到一个(类似Java的)“entry”对象。因此'st'=>{key=>'name',value=>'svu'}。因此,
st.name
什么都不是

这更像是你想要的(或者说是有效的):

我不得不将student#12上的“学期”改为数组,并将“数字”取消大写。这就是您所拥有的:

   'semester'=>{
          'Number'=>'1',
          'subjects'=>'7',
           'rank'=>'1'
          }
我将其改为:

   'semester'=>[{
          'number'=>'1',
          'subjects'=>'7',
           'rank'=>'1'
          }]
如果没有数组,您只是再次迭代这种类型的内容:

( { key => 'number',   value => '1' }
, { key => 'subjects', value => '7' }
, { key => 'rank',     value => '1' } 
)
而且不一定(甚至不可能)按这个顺序

使用正确关闭的
$var1
作为数据,我在上面输入的代码给出了:

   \documentclass[a4paper,leqno,twoside]{article}
   \begin{document}

name:
      svu 
location:
      ravru
studentdata:
      student name=xxx number=12
     semester number=1 subjects=7 rank=1
      student name=xxx number=15
     semester number=1 subjects=7 rank=10
     semester number=1 subjects=7 rank=1
      student name=xxx number=16
     semester number=1 subjects=7 rank=2
     semester number=2 subjects=4 rank=2
  \end{document}
要调试脚本,您可能需要进行以下更改:

my $template = Template->new( { EVAL_PERL => 1 } );
然后,如果您想查看正在寻址的结构,请执行以下操作:

 [% RAWPERL %]
 use Data::Dumper ();
 print Data::Dumper->Dump( [ $stash->get( 'semester' ) ], [ 'semester' ] ), "\n";
 [% END %]
当学期中的哈希没有数字、主题或等级字段时,您将很快看到


(回答评论)好吧,如果你有一些学生的地址和一些没有,你可以做以下事情:

[% IF student.address;
    addr = student.address; %][%-
    -%]Address: [% addr.lines.1 %]
                [% addr.lines.2 %]
                [% addr.city %], [% addr.state %] [% addr.zip %]
[% END %]
或者,如果您有一个地址散列,您可以执行以下操作

[% IF address_for_student.exists( student.number );
     address = address_for_student.item( student.number );
     %]
...
[% END %]

(回答问题的新地址部分)

您可以在演示之前对数据进行按摩。这是我在将数据传递到演示层之前的建议。(此处
$studentaddress
只是对隐藏结构的引用。)

然后,在表示层中,您可以执行以下操作:

[% address = studentaddres.by_student_number.item( student.number );
   IF address %]
   ...
[% END %]
通常,您应该在表示层之前拥有所需的链接,这使得表示层只需显示数据即可

XML存储您的模型。很好。XML可以很好地存储树,但不能很好地存储复杂的图形。因此,如果您有复杂的关系(而XML::Simple对这些关系一无所知),则必须使用这种类型的算法模型:检索→ 链接→ display。您必须使用YAML或JSON甚至从数据库中提取的行来执行此操作,因此链接阶段是我的第二天性


表示层是错误的搜索层。它应该只处理0、1或多个或简单情况的列表,如关系是否存在。

首先,您的数据不是有效的perl。其次,通过哈希迭代会得到一个(类似Java的)“条目”对象。因此'st'=>{key=>'name',value=>'svu'}因此,
st.name
什么都不是

这更像是你想要的(或者说是有效的):

我不得不将student#12上的“学期”改为数组,并将“数字”取消大写。这就是您所拥有的:

   'semester'=>{
          'Number'=>'1',
          'subjects'=>'7',
           'rank'=>'1'
          }
我将其改为:

   'semester'=>[{
          'number'=>'1',
          'subjects'=>'7',
           'rank'=>'1'
          }]
如果没有数组,您只是再次迭代这种类型的内容:

( { key => 'number',   value => '1' }
, { key => 'subjects', value => '7' }
, { key => 'rank',     value => '1' } 
)
而且不一定(甚至不可能)按这个顺序

使用正确关闭的
$var1
作为数据,我在上面输入的代码给出了:

   \documentclass[a4paper,leqno,twoside]{article}
   \begin{document}

name:
      svu 
location:
      ravru
studentdata:
      student name=xxx number=12
     semester number=1 subjects=7 rank=1
      student name=xxx number=15
     semester number=1 subjects=7 rank=10
     semester number=1 subjects=7 rank=1
      student name=xxx number=16
     semester number=1 subjects=7 rank=2
     semester number=2 subjects=4 rank=2
  \end{document}
要调试脚本,您可能需要进行以下更改:

my $template = Template->new( { EVAL_PERL => 1 } );
然后,如果您想查看正在寻址的结构,请执行以下操作:

 [% RAWPERL %]
 use Data::Dumper ();
 print Data::Dumper->Dump( [ $stash->get( 'semester' ) ], [ 'semester' ] ), "\n";
 [% END %]
当学期中的哈希没有数字、主题或等级字段时,您将很快看到


(回答评论)好吧,如果你有一些学生的地址和一些没有,你可以做以下事情:

[% IF student.address;
    addr = student.address; %][%-
    -%]Address: [% addr.lines.1 %]
                [% addr.lines.2 %]
                [% addr.city %], [% addr.state %] [% addr.zip %]
[% END %]
或者,如果您有一个地址散列,您可以执行以下操作

[% IF address_for_student.exists( student.number );
     address = address_for_student.item( student.number );
     %]
...
[% END %]

(回答问题的新地址部分)

您可以在演示之前对数据进行按摩。这是我在将数据传递到演示层之前的建议。(此处
$studentaddress
只是对隐藏结构的引用。)

然后,在表示层中,您可以执行以下操作:

[% address = studentaddres.by_student_number.item( student.number );
   IF address %]
   ...
[% END %]
通常,您应该在表示层之前拥有所需的链接,这使得表示层只需显示数据即可

XML存储您的模型。很好。XML可以很好地存储树,但不能很好地存储复杂的图形。因此,如果您有复杂的关系(而XML::Simple对这些关系一无所知),则必须使用这种类型的算法模型:检索→ 链接→ display。您必须使用YAML或JSON甚至从数据库中提取的行来执行此操作,因此链接阶段是我的第二天性


表示层是错误的搜索层。它应该只处理0、1或许多或简单情况的列表,如关系存在与否。

我有15个大学,所以我为循环编写了获取所有大学的值,我正在获取所有值,但我的问题在第二个for循环中。我无法获得我想要的学生元素。That表示循环执行三次,如果一个学生和一个学期在电子学。如果我有两个或两个以上的学生和两个或两个以上的学期在ele