Stroustrup gần đây đã đăng một loạt các bài đăng vạch trần những huyền thoại phổ biến về C ++ . Huyền thoại thứ năm là: Chỉ C ++ dành cho các chương trình lớn, phức tạp, chỉ có. Để gỡ lỗi, anh ta đã viết một chương trình C ++ đơn giản tải xuống một trang web và trích xuất các liên kết từ nó . Đây là:
#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;
}
}
Hãy cho Stroustrup biết chương trình nhỏ và dễ đọc thực sự là gì.
- Tải xuống
http://www.stroustrup.com/C++.html
Liệt kê tất cả các liên kết:
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 ...
Bạn có thể sử dụng bất kỳ ngôn ngữ nào, nhưng không cho phép thư viện của bên thứ ba.
Người chiến thắng
Câu trả lời của C ++ đã giành được bằng phiếu bầu, nhưng nó dựa vào thư viện của bên thứ ba (không được phép theo quy tắc) và cùng với một đối thủ cạnh tranh thân thiết khác là Bash , dựa vào ứng dụng khách HTTP bị hack (nó sẽ không hoạt động với HTTPS, gzip, chuyển hướng, v.v.). Vì vậy, Wolfram là một người chiến thắng rõ ràng. Một giải pháp khác gần gũi về kích thước và khả năng đọc là PowerShell (với sự cải thiện từ các bình luận), nhưng nó đã không nhận được nhiều sự chú ý. Các ngôn ngữ chính ( Python , C # ) cũng đến khá gần.
Content-Type: text/html; charset=UTF-8
... Tôi sẽ gửi email cho anh ấy.
boost/asio
được sử dụng ở đó là thư viện của bên thứ ba. Ý tôi là làm thế nào các ngôn ngữ không bao gồm tìm nạp url / tcp như một phần của thư viện chuẩn của nó sẽ cạnh tranh?