Perl:使用 curl 输出格式化 table
Perl: Format table with curl outputs
我有类似下面的 curl 代码:
foreach my $value ('1', ..., '5') {
my $count = 1;
print "\nValue: $value\n\t";
my $start = `curl -m 10 -s "http://SITE/?value=$value" -c cookie.txt`;
my $end1 = `curl -m 10 -s "http://SITE2" -b cookie.txt`;
if($end1 ne "") {print ". "}; else print "$count ";
my $end2 = `curl -m 10 -s "http://SITE3" -b cookie.txt`;
if($end2 ne "") {print ". "}; else print "$count ";
my $end3 = `curl -m 10 -s "http://SITE4" -b cookie.txt`;
if($end3 ne "") {print ". "}; else print "$count ";
$count++;
}
所以从值 1
到 5
,它访问一个网站并将 cookie 值存储在 cookie.txt 中。然后它使用 cookie.txt 中存储的 cookie 访问 3 个不同的网站。访问这些站点后,它会打印当前计数(如果请求在 10 秒后超时,则显示 .
)。
此示例输出为:
Value: 1
1 1 1 2 . 2 3 3 3 4 . . . 5 5
Value: 2
. . 1 2 2 2 3 3 3 4 . 4 5 5 .
是否可以将输出格式化为:
Value: 1
Site2: 1 2 3 4 .
Site3: 1 . 3 . 5
Site4: 1 2 3 . 5
Value: 2
Site2: . 2 3 4 5
Site3: . 2 3 . 5
Site4: 1 2 3 4 .
我遇到的问题是在循环中,每个循环我只想 运行 $start
一次。按照我想要的格式,每个站点必须 运行 一次(3 次)。
您的要求有点令人困惑,但这将为您提供所需的输出:
my @sites = qw( SITE2 SITE3 SITE4 );
foreach my $value ('1'..'5') {
print "\nValue: $value\n";
my $start = `curl -m 10 -s "http://SITE/?value=$value" -c cookie.txt`;
for my $site (@sites) {
print "\t$site ";
for (1..5) { # assuming you want to fetch each url 5x
my $end = `curl -m 10 -s "http://$site" -b cookie.txt`;
print $end eq '' ? '. ' : $_.' ';
}
print "\n";
}
}
请开启use strict;
和use warnings
。
如果这样做,您会发现:
foreach my $value ('1', ..., '5') {
print $value,"\n";
}
是语法错误。这不是一个好的开始。也许你想要:
foreach my $value ( 1..5) {
print $value,"\n";
}
同样,您有一个永远不会更改的 $count
变量,因为您在循环中将其局限在本地(通过 my
)并在每次迭代中将其设置为 1。然后在最后增加它,就在它超出范围之前。
我有类似下面的 curl 代码:
foreach my $value ('1', ..., '5') {
my $count = 1;
print "\nValue: $value\n\t";
my $start = `curl -m 10 -s "http://SITE/?value=$value" -c cookie.txt`;
my $end1 = `curl -m 10 -s "http://SITE2" -b cookie.txt`;
if($end1 ne "") {print ". "}; else print "$count ";
my $end2 = `curl -m 10 -s "http://SITE3" -b cookie.txt`;
if($end2 ne "") {print ". "}; else print "$count ";
my $end3 = `curl -m 10 -s "http://SITE4" -b cookie.txt`;
if($end3 ne "") {print ". "}; else print "$count ";
$count++;
}
所以从值 1
到 5
,它访问一个网站并将 cookie 值存储在 cookie.txt 中。然后它使用 cookie.txt 中存储的 cookie 访问 3 个不同的网站。访问这些站点后,它会打印当前计数(如果请求在 10 秒后超时,则显示 .
)。
此示例输出为:
Value: 1
1 1 1 2 . 2 3 3 3 4 . . . 5 5
Value: 2
. . 1 2 2 2 3 3 3 4 . 4 5 5 .
是否可以将输出格式化为:
Value: 1
Site2: 1 2 3 4 .
Site3: 1 . 3 . 5
Site4: 1 2 3 . 5
Value: 2
Site2: . 2 3 4 5
Site3: . 2 3 . 5
Site4: 1 2 3 4 .
我遇到的问题是在循环中,每个循环我只想 运行 $start
一次。按照我想要的格式,每个站点必须 运行 一次(3 次)。
您的要求有点令人困惑,但这将为您提供所需的输出:
my @sites = qw( SITE2 SITE3 SITE4 );
foreach my $value ('1'..'5') {
print "\nValue: $value\n";
my $start = `curl -m 10 -s "http://SITE/?value=$value" -c cookie.txt`;
for my $site (@sites) {
print "\t$site ";
for (1..5) { # assuming you want to fetch each url 5x
my $end = `curl -m 10 -s "http://$site" -b cookie.txt`;
print $end eq '' ? '. ' : $_.' ';
}
print "\n";
}
}
请开启use strict;
和use warnings
。
如果这样做,您会发现:
foreach my $value ('1', ..., '5') {
print $value,"\n";
}
是语法错误。这不是一个好的开始。也许你想要:
foreach my $value ( 1..5) {
print $value,"\n";
}
同样,您有一个永远不会更改的 $count
变量,因为您在循环中将其局限在本地(通过 my
)并在每次迭代中将其设置为 1。然后在最后增加它,就在它超出范围之前。