Stroustrup a récemment publié une série de messages qui réfutent les mythes populaires sur le C ++ . Le cinquième mythe est le suivant: «C ++ s’applique uniquement aux grands programmes compliqués». Pour le démystifier, il a écrit un simple programme C ++ téléchargeant une page Web et en extrayant des liens . C'est ici:
#include <string>
#include <set>
#include <iostream>
#include <sstream>
#include <regex>
#include <boost/asio.hpp>
using namespace std;
set<string> get_strings(istream& is, regex pat)
{
set<string> res;
smatch m;
for (string s; getline(is, s);) // read a line
if (regex_search(s, m, pat))
res.insert(m[0]); // save match in set
return res;
}
void connect_to_file(iostream& s, const string& server, const string& file)
// open a connection to server and open an attach file to s
// skip headers
{
if (!s)
throw runtime_error{ "can't connect\n" };
// Request to read the file from the server:
s << "GET " << "http://" + server + "/" + file << " HTTP/1.0\r\n";
s << "Host: " << server << "\r\n";
s << "Accept: */*\r\n";
s << "Connection: close\r\n\r\n";
// Check that the response is OK:
string http_version;
unsigned int status_code;
s >> http_version >> status_code;
string status_message;
getline(s, status_message);
if (!s || http_version.substr(0, 5) != "HTTP/")
throw runtime_error{ "Invalid response\n" };
if (status_code != 200)
throw runtime_error{ "Response returned with status code" };
// Discard the response headers, which are terminated by a blank line:
string header;
while (getline(s, header) && header != "\r")
;
}
int main()
{
try {
string server = "www.stroustrup.com";
boost::asio::ip::tcp::iostream s{ server, "http" }; // make a connection
connect_to_file(s, server, "C++.html"); // check and open file
regex pat{ R"((http://)?www([./#\+-]\w*)+)" }; // URL
for (auto x : get_strings(s, pat)) // look for URLs
cout << x << '\n';
}
catch (std::exception& e) {
std::cout << "Exception: " << e.what() << "\n";
return 1;
}
}
Montrons à Stroustrup ce qu'est un petit programme lisible .
- Télécharger
http://www.stroustrup.com/C++.html
Lister tous les liens:
http://www-h.eng.cam.ac.uk/help/tpl/languages/C++.html http://www.accu.org http://www.artima.co/cppsource http://www.boost.org ...
Vous pouvez utiliser n'importe quelle langue, mais aucune bibliothèque tierce n'est autorisée.
Gagnant
La réponse C ++ a été remportée par un vote, mais elle repose sur une bibliothèque semi-tierce (interdite par les règles) et, avec un autre concurrent proche, Bash , sur un client HTTP piraté (cela ne fonctionnera pas avec HTTPS, gzip, redirections, etc.). Donc, Wolfram est un gagnant clair. Une autre solution qui se rapproche du point de vue de la taille et de la lisibilité est PowerShell (avec une amélioration par rapport aux commentaires), mais elle n’a pas suscité beaucoup d’attention. Les langages traditionnels ( Python , C # ) sont également très proches.
Content-Type: text/html; charset=UTF-8
... Je vais lui envoyer un courriel.
boost/asio
est utilisé là - bas qui est une bibliothèque tiers. Je veux dire, comment les langues qui n'incluent pas l'extraction url / tcp dans le cadre de sa bibliothèque standard entrent-elles en concurrence?