Можно также вновь открыть суд и cerr потоки для вывода в файл также. Следующее должно работать на это:
#include <iostream>
#include <fstream>
int main ()
{
std::ofstream file;
file.open ("cout.txt");
std::streambuf* sbuf = std::cout.rdbuf();
std::cout.rdbuf(file.rdbuf());
//cout is now pointing to a file
return 0;
}
Спецификация JSON предоставляет довольно четкие правила для формата числа, поэтому следующее регулярное выражение должно работать:
/^-?(0|([1-9][0-9]*))(\.[0-9]+)?([eE][-+]?[0-9]+)?$/
Вы можете просто превратить его в число, а затем сравнить его с исходной строкой.
if( $value eq $value+0 ){
print "$value is a number\n";
}
(Примечание: это будет работать только для простых чисел, таких как 123 или 12,3)
Попробуйте Scalar :: Util :: look_like_number
:
Например:
use Scalar::Util qw(looks_like_number);
if (looks_like_number($thingy)) {
print "looks like $thingy is a number...\n"
}
I think this question from perlfaq solves your problem.
Generally the problem is defining what exactly you want to read as number.
It might be easier for you to just read the XML into a data structure in Perl and let Perl's JSON library figure it out for you. It already has checking for that, so unless your number is actually a string in the XML (e.g. it's got a space after it, etc) JSON->encode()
will encode it as a JSON number.
Я думаю (исходя из недавнего опыта), что вы делаете ошибку, выполняя любое ручное преобразование XML-> JSON. Я столкнулся со многими ошибками в этом процессе, не в последнюю очередь из-за неправильно экранированных символов.
Я бы порекомендовал проанализировать ваш XML с помощью одного из многих модулей XML :: * (я использовал XML :: Simple), а затем отобразить его как JSON с использованием JSON :: XS. JSON :: XS позволяет преобразовывать структуру данных Perl в JSON; XML :: Simple анализирует XML в структуру данных Perl. А пока вы можете манипулировать структурой данных Perl по своему усмотрению.
Суть в том, что вы больше не заботитесь о заключении в кавычки / экранировании символов.