无法运行perl脚本,使用命令未找到?

时间:2015-09-17 18:17:11

标签: xml linux perl

我有一个xml文件(client_23.xml),其中我需要在特定部分添加几行,而不是其他xml文件(abc_lop.xml)中的内容。

以下是我的abc_lop.xml文件,其中您看到我有很多ClientField行,其中包含namepptypedataType

<Hello version="100">
 <DataHolder numberOfFields="67">
  <ClientField name="target" pptype="aligning" dataType="string">
   <Value value="panel_3646"/>
   <Value value="panel_3653"/>
  </ClientField>
  <ClientField name="category_3652_0_count" pptype="symetrical" dataType="double"/>
  <ClientField name="pme.age" pptype="symetrical" dataType="double"/>
  <ClientField name="pme.gender" pptype="aligning" dataType="string">
   <Value value=""/>
   <Value value="F   "/>
   <Value value="NA"/>
  </ClientField>
 </DataHolder>
</Hello>

我需要阅读此文件并从name行中提取ClientField,如果pptype不是aligning,那么我需要为每个名称构建此行:下面是两个名称的示例,只有第一个值不同,除此之外,其他两个名称将始终相同。

<eval>upsert("category_3652_0_count", 0, $calty_doubles)</eval>
<eval>upsert("category_3652_2_count", 0, $calty_doubles)</eval>

现在,如果pptypealigning,则构造如下所示的行:

<eval>upsert("target", "NA", $calty_strings)</eval>
<eval>upsert("pme.gender", "NA", $calty_strings)</eval>

我必须在client_23.xml文件中进行所有这些更改,然后使用它创建一个新文件,以便我的新文件看起来像这样:我将有一个名为data_values的函数其中我需要在<block>标记中添加上述内容,如下所示。

    <function>
        <name>data_values</name>
        <variables>
            <variable>
            <name>temp</name>
            <type>double</type>
            </variable>
        </variables>
        <block>
            <eval>temp = 1</eval>
            <eval>upsert("category_3652_0_count", 0, $calty_doubles)</eval>
            <eval>upsert("category_3652_2_count", 0, $calty_doubles)</eval>
            <eval>upsert("target", "NA", $calty_strings)</eval>
            <eval>upsert("pme.gender", "NA", $calty_strings)</eval>             
        </block>
    </function>

这是我目前在client_23.xml文件中的内容,因此在添加之后,它将如上所示:

    <function>
        <name>data_values</name>
        <variables>
            <variable>
            <name>temp</name>
            <type>double</type>
            </variable>
        </variables>
        <block>
            <eval>temp = 1</eval>
        </block>
    </function>

我提出了下面的perl脚本,但每当我尝试运行它时,它都没有运行,我看到了一些错误:

#!/usr/bin/perl
use strict;
use warnings;

use XML::LibXML;

# Open the main XML file and locate the
# <block> element that we need to insert into
#
my $doc = XML::LibXML->load_xml(
    location => 'client_23.xml',
    no_blanks => 1,
);
my $block = $doc->find('/function/block')->get_node(1);

# Open the secondary XML file and find all the <ClientField> elements
# that contain the data we need to insert
#
my $abc = XML::LibXML->load_xml(location => 'abc_lop.xml');

for my $field ( $abc->find('/Hello/DataHolder/ClientField')->get_nodelist ) {

    my ($name, $pptype) = map $field->getAttribute($_), qw/ name pptype /;

    my $text = $pptype eq 'aligning' ?
        sprintf q{upsert("%s", "NA", $calty_strings)}, $name :
        sprintf q{upsert("%s", 0, $calty_doubles)}, $name;

    $block->appendTextChild('eval' , $text);
}

print $doc->toString(2);

我制作了perl脚本可执行文件并像这样运行它,我收到了一个错误。怎么了?

./tester.perl: line 1: use: command not found
./tester.perl: line 2: use: command not found
./tester.perl: line 4: use: command not found
./tester.perl: line 9: syntax error near unexpected token `('
./tester.perl: line 9: `my $doc = XML::LibXML->load_xml('

更新: -

现在修复了使用错误。我看到了这个错误:

Can't locate XML/LibXML.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) at ./tester.perl line 5.
BEGIN failed--compilation aborted at ./tester.perl line 5.

我需要安装任何东西吗?

2 个答案:

答案 0 :(得分:2)

Can't locate XML/LibXML.pm 

因此您需要安装XML :: LibXML模块。尝试其中一个命令。

如果你有sudo访问权限,并且在Debian Linux或Ubuntu上,请运行:

sudo apt-get install libxml-perl

如果你有sudo访问权限并且使用的是Red Hat,CentOS,Fedora或Amazon Linux:

sudo yum install perl-XML-LibXML

sudo的其他平台上(例如OS X),这应该可行,但如果您之前没有运行cpan,则必须回答很多问题:

sudo cpan XML::LibXML

如果您没有sudo访问权限,请在没有sudo的情况下运行相同的命令,并在询问您希望采取的方法时选择local::lib

cpan XML::LibXML

答案 1 :(得分:1)

而不是通过名称调用脚本:

perl /path/to/perl/script

我想知道你的第一行是否有隐藏的角色。你在DOS下写了这个文件吗?

使用您的更新,您将不得不安装它找不到的Perl模块。 CPAN上有关于如何安装其他模块的说明。

相关问题