我正在尝试访问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脚本中定义的变量?
答案 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");
会做你正在寻找的替代品。