系统中的Perl变量()

时间:2014-05-28 19:44:17

标签: perl

我正在尝试访问perl中的一系列网页并将其写入一系列文件。我的代码看起来像这样:

  open IN , "AbsoluteFinalData.txt"; #Each line has a number and ID name separated by a tab.

        while(my $line = <IN>){

    chop $line; #removes newline at the end
my @first_split = split(/\t/, $line);
my $IDnum = $first_split[0];
my $Uniprot = $first_split[1];

    system('Uniprot=$Uniprot; curl -o "$Uniprot.html" http://pfam.xfam.org/\protein/.$Uniprot'); #More stuff after

然而,当我尝试在system()中调用$ Uniprot时,该程序正在让我适应。有没有办法使用system()调用perl脚本中定义的变量?

3 个答案:

答案 0 :(得分:3)

system('Uniprot=$Uniprot; curl -o "$Uniprot.html" http://pfam.xfam.org/\protein/.$Uniprot');

您使用单引号,它不会进行插值。文字命令:

Uniprot=$Uniprot; curl -o "$Uniprot.html" http://pfam.xfam.org/\protein/.$Uniprot

正在执行。

您想要插入变量,这意味着使用双引号(并转义包含的变量:)

system("Uniprot=$Uniprot; curl -o \"$Uniprot.html\" http://pfam.xfam.org/\protein/.$Uniprot");

或者qq类似于引号的运算符,其功能类似于双引号,但避免需要转义包含双引号:

system(qq(Uniprot=$Uniprot; curl -o "$Uniprot.html" http://pfam.xfam.org/\protein/.$Uniprot"));

答案 1 :(得分:3)

鉴于您不依赖于system命令来执行任何shell解释或文件I / O重定向,您可以像这样实现安全所需的一切:< / p>

system 'curl', '-o', "$Uniprot.html", "http://pfam.xfam.org/protein/.$Uniprot";

&#34;列表&#34; system的版本比单字符串版本更安全,因为它可以防止shell命令注入攻击。

还要注意使用双引号来启用Perl自己的变量插值,并且还没有必要创建shell局部变量Uniprot=$Uniprot,因为它没有被使用由Curl提供,仅供您尝试自行执行变量插值。

答案 2 :(得分:0)

Perl只在双引号("...")内插入变量,而不是单引号('...')。

system("Uniprot=$Uniprot; curl -o \"$Uniprot.html\" http://pfam.xfam.org/\protein/.$Uniprot");

会做你正在寻找的替代品。