为什么使用Template在FOREACH循环中出现错误?

为什么使用Template在FOREACH循环中出现错误?

问题描述:

我需要帮助解决这个问题,我从过去15天开始苦苦挣扎,请帮助我。我有xml文件,并且使用XML :: simple存储在一个变量中。我通过模板工具包进行处理。我收到错误这样为什么使用Template在FOREACH循环中出现错误?

$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} 

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

 studentdata: 
      studentdata: 
      studentdata: 

为什么循环执行这样的,我真的不能明白自己做错了什么赢for循环但我需要像这样打印

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的)“入口”对象。所以'st'=> {key =>'name',value =>'svu'}。因此st.name不算什么。

这更像是你想要的东西(或什么工作,反正):

name: 
     [% university.name %] 
location: 
     [% university.location %] 
studentdata: 
    [%- FOREACH student IN university.branch.electronics.student %] 
     student name=[% student.name %] number=[% student.number %] 
     [%- FOREACH semester IN student.semester %] 
    semester number=[% semester.number %] subjects=[% semester.subjects 
      %] rank=[% semester.rank %] 
     [%- END -%] 
    [%- END -%] 

我不得不改变对学生的#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 %] 

(答题的新地址部分)

可以演示文稿之前按摩你的数据。这是我建议之前传递数据到表示层。 (这里$studentaddres只是在藏匿结构的参考。)

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

然后,在表示层你可以这样做:

[% address = studentaddres.by_student_number.item(student.number); 
    IF address %] 
    ... 
[% END %] 

在一般情况下,你应该有链接,您需要之前的到表示层,这使得表示层只是显示数据的问题。

XML存储您的模型。精细。 XML可以很好地处理树,但不能很好地处理复杂的图。所以如果你有复杂的关系(而且XML :: Simple不会知道关于这些的任何),你必须使用这种类型的算法模型:检索→链接→显示。你必须用YAML或JSON或从数据库中取出行来做到这一点,所以链接阶段对我来说是第二性质的。

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

+0

我有15所大学,所以我写了循环获取所有大学的,我得到的所有价值观,但我的问题是在第二个循环。我无法按照自己的想法获得学生元素。如果一个学生和一个学期的电子学课程循环执行三次。如果我有两个或两个以上的学生和两个或两个以上的电子学期的学期打印完全。我不知道为什么这个问题。正如我所说的,@pavini, – pavani

+0

。 1)你的数据不好,2)你正在迭代哈希。由于有三把钥匙,你绕了三圈。查看我对学生#12所做的更改。 – Axeman

+0

@pavini,看修改后的答案。 – Axeman