我有.sh脚本,除其他外,该脚本从Google获取以下货币汇率:
printf 'Bash: Going to get exchange rates'
echo
wget -qO- "http://www.google.com/finance/converter?a=1&from=usd&to=aud" | sed '/res/!d;s/<[^>]*>//g' > exrates
wget -qO- "http://www.google.com/finance/converter?a=1&from=usd&to=jpy" | sed '/res/!d;s/<[^>]*>//g' >> exrates
wget -qO- "http://www.google.com/finance/converter?a=1&from=usd&to=hkd" | sed '/res/!d;s/<[^>]*>//g' >> exrates
wget -qO- "http://www.google.com/finance/converter?a=1&from=usd&to=nzd" | sed '/res/!d;s/<[^>]*>//g' >> exrates
wget -qO- "http://www.google.com/finance/converter?a=1&from=usd&to=eur" | sed '/res/!d;s/<[^>]*>//g' >> exrates
wget -qO- "http://www.google.com/finance/converter?a=1&from=usd&to=gbp" | sed '/res/!d;s/<[^>]*>//g' >> exrates
mv /home/stan/perl/2014/scripts/exrates /home/stan/perl/2014/exrates/exrates
printf 'Bash: Got exchange rates'
echo
Run Code Online (Sandbox Code Playgroud)
但是,有时脚本会挂在这里。我不介意每次运行时都不更新这些速率,如果挂起,我想完全跳过此步骤,但是如何?
我应该在“ if”语句中输入什么内容,以检查wget是否可以迅速获取数据或将永远使用?wget执行中的更多详细信息也不会受到伤害。
顺便说一句,我不知道为什么wget挂了。浏览器可以正常打开这些页面,相同的命令也可以从终端逐行运行。
我有二十几个.csv文件,每个文件大约有一千行,它们是用Tie :: Array :: CSV创建的.现在我想每天为每一个添加一行或两行,最有效的方法是什么?
我想我可以将每个文件读入一个数组,添加我的数据,然后再将数据写回csv,但这意味着如果在覆盖期间出现问题,我可能会丢失所有数据,如果我创建新文件,我需要弄清楚一些系统自动管理每天堆积的所有副本副本.
如果没有模块可以追加行,那么如何使用所有约定和正确csv所需的转义字符手动完成它们,以便它们可以毫无问题地读回perl?
...
感谢您的回复,我没有足够的声誉直接为答案添加评论,所以我找到了原来的问题.
我不担心丢失我的数据太多,我可以从头开始重建它,它只需要时间和人工干预,但不足以保证运行每日备份系统,认为它总是需要考虑的一点.在处理时间上添加行也应该更容易,因为在我的机器上将.csv写入磁盘相对较慢.
以追加模式打开文件是我不知道的.$csv->print($fh, $row);我应该通过一个循环运行这个解决方案,以增加多条线路吗?
我在Perlmonks上提出了另一个解决方案
use Tie::Array::CSV;
my $filename = 'tied.csv';
tie my @file, 'Tie::Array::CSV', $filename;
push(@file,[4,5,6]);
untie @file;
Run Code Online (Sandbox Code Playgroud)
那会更好吗?我现在没有机会测试它.
编辑.Push()解决方案高于工作魔力.考虑这个结束.