Возможно, вы сможете сделать это с помощью xpath. что-то вроде //tr[contains(@class, 'row') and position() mod 2 = 0]
может работать. Существуют другие вопросы SO, расширяющие подробности о том, как более точно сопоставлять классы.
Вам нужно закрыть файл $ file после того, как вы получили данные с сервера и записали их в файл:
open(my $file, '>', $filename) or die $!;
print $file $string;
close($file) # Add this line
Мне также пришлось использовать http: // вместо https: // in $ address, но я нахожусь на коробке CentOS со старой установкой LWP, которая, кажется, не делает TLS.
Ваша проблема в том, что вам нужно явно close()
файл, в который вы пишете, прежде чем вы сможете снова открыть его для чтения из него.
Но весь этот промежуточный файл не имеет смысла (, как я предлагал ранее ). Просто обработайте все данные в памяти, прежде чем записать их в выходной файл.
use strict;
use warnings;
use feature 'say';
use LWP::Simple;
my $dateField = 'date=2018-12-31';
my $currency = "USD";
my $filename = 'doc3.txt';
my $address = "https://www.oanda.com/rates/api/v1/rates/$currency.csv?"
. "api_key=gpolonsky&decimal_places=4&$dateField&fields=averages&"
. "quote=USD"e=AUD"e=BRL"e=CAD"e=GBP&"
. "quote=CHF"e=CNY"e=DKK"e=HKD"e=INR&"
. "quote=IDR"e=ILS"e=JPY"e=MXN"e=NOK&"
. "quote=PHP"e=PLN"e=SGD"e=sKK"e=ZAR&"
. "quote=KRW"e=SEK"e=TWD"e=THB"e=EUR&"
. "quote=MYR"e=NZD"e=SAR"e=TRY"e=RUB&"
. "quote=CZK"e=AED"e=CLP"e=EGP"e=MAD&"
. "quote=NGN"e=OMR"e=QAR";
my $content = get($address);
# I've removed $! from the die() error below. $! is the last
# *operating system* error. And making an HTTP request is not
# an operating system operation - so the contents will have no
# connection to the results of our GET request.
defined $content or die "Cannot read '$address'";
$content =~ s/^[^\n]*\n//s;
$content =~ s/^/20181231,/gm; # The m option makes ^ match at the start of each line
$content =~ s/,2018-12-3[0-9]T[0-9][0-9]:[0-9][0-9]:[0-9][0-9]\+0000*//g;
$content =~ s/([A-Z][A-Z][A-Z]),[0-9]*\.[0-9][0-9][0-9][0-9]/$1/g;
my @curOrd = qw( USD AUD BRL GBP CAD CNY DKK HKD INR IDR ILS JPY MXN
NOK PHP PLN SGD SKK ZAR KRW SEK CHF TWD THB EUR MYR
NZD SAR TRY RUB CZK AED CLP EGP MAD NGN OMR QAR );
my $i = 1;
my %curr_lookup = map { Ваша проблема в том, что вам нужно явно close()
файл, в который вы пишете, прежде чем вы сможете снова открыть его для чтения из него.
Но весь этот промежуточный файл не имеет смысла (, как я предлагал ранее ). Просто обработайте все данные в памяти, прежде чем записать их в выходной файл.
[110] => $i++ } @curOrd;
my @data = map { [ split /,/ ] } split /\n/, $content;
my $outfile = 'file2.txt';
@data = sort { $curr_lookup{$a->[2]} <=> $curr_lookup{$b->[2]} }
@data;
open my $out, '>', $outfile or die "Can't open $outfile for writing: $!";
say $out join ',', @ Ваша проблема в том, что вам нужно явно close()
файл, в который вы пишете, прежде чем вы сможете снова открыть его для чтения из него.
Но весь этот промежуточный файл не имеет смысла (, как я предлагал ранее ). Просто обработайте все данные в памяти, прежде чем записать их в выходной файл.
[110] for @data;