Perl中LWP::Simple的get()为何无法通过变量传递URL?
为何无法将URL字符串传入get()函数的变量中?
问题代码
#use strict; use warnings; use LWP::Simple; my $hxUrl; my $Page; $hxUrl="https://finance.yahoo.com/quote/SPY/history?period1=1653177600& period2=1685059200&interval=1d&filter=history&frequency=1d&includeAdjustedClose=true"; #使用变量时,页面无法读取 $Page = get($hxURL); print "at 10: length(Page) =", length($Page), "\n"; # length($Page) = null #直接使用字符串时,页面可正常访问 $Page = get("https://finance.yahoo.com/quote/SPY/history?period1=1653177600& period2=1685059200&interval=1d&filter=history&frequency=1d&includeAdjustedClose=true"); print "at 14:length(Page) =", length($Page), "\n"; # length($Page) = 1399524
遇到的报错
注释掉use strict前,编译报错:
Global symbol "$hxURL" requires explicit package name (did you forget to declare "my $hxURL"?) at test.pl line 9.
注释掉use strict后,使用变量调用get()时返回空值,直接传字符串则正常获取页面内容。调整my的声明位置也无法解决问题。
问题原因
Perl是大小写敏感的编程语言,你声明的变量是$hxUrl(首字母小写的Url),但调用get()时用的是$hxURL(全大写的URL),这是两个完全独立的变量。
未开启use strict时,Perl会自动将未声明的$hxURL视为全局变量,其值为undef,传入get()自然无法获取到页面内容;开启use strict时,Perl会严格检查变量声明,所以直接报错提示$hxURL未声明。
解决方法
将变量名统一,把调用get()时的$hxURL改为$hxUrl即可。修正后的代码如下:
use strict; use warnings; use LWP::Simple; my $hxUrl; my $Page; $hxUrl="https://finance.yahoo.com/quote/SPY/history?period1=1653177600& period2=1685059200&interval=1d&filter=history&frequency=1d&includeAdjustedClose=true"; # 使用统一的变量名 $Page = get($hxUrl); print "at 10: length(Page) =", length($Page), "\n"; $Page = get("https://finance.yahoo.com/quote/SPY/history?period1=1653177600& period2=1685059200&interval=1d&filter=history&frequency=1d&includeAdjustedClose=true"); print "at 14:length(Page) =", length($Page), "\n";
这样不管是否开启use strict,都能正常将URL传入get()函数并获取页面内容。
内容的提问来源于stack exchange,提问作者user1067305
相关产品推荐
相关产品推荐

