डीब्रीकिंग स्ट्रॉन्स्ट्रुप के मिथक की चर्चा "सी ++ बड़े, जटिल, कार्यक्रमों के लिए ही है"


161

स्ट्रॉस्ट्रुप ने हाल ही में सी ++ के बारे में लोकप्रिय मिथकों को खारिज करते हुए कई पोस्ट किए हैं । पाँचवाँ मिथक है: "C ++ बड़े, जटिल, कार्यक्रमों के लिए ही है"। इसे डीबंक करने के लिए, उसने एक वेब पेज डाउनलोड करने और उससे लिंक निकालने के लिए एक सरल सी ++ प्रोग्राम लिखा । यह रहा:

#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;
    }
}

आइए स्ट्रोस्ट्रुप को दिखाएं कि वास्तव में छोटा और पठनीय कार्यक्रम क्या है।

  1. डाउनलोड http://www.stroustrup.com/C++.html
  2. सभी लिंक सूचीबद्ध करें:

    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
    ...
    

आप किसी भी भाषा का उपयोग कर सकते हैं, लेकिन किसी भी तृतीय-पक्ष लाइब्रेरी की अनुमति नहीं है।

विजेता

C ++ उत्तर वोटों से जीता है, लेकिन यह एक अर्ध-तृतीय-पक्ष लाइब्रेरी (जो नियमों द्वारा अस्वीकृत है) पर निर्भर करता है , और, एक अन्य करीबी प्रतियोगी बैश के साथ , एक साथ हैक किए गए HTTP क्लाइंट पर निर्भर करता है (यह HTTPS के साथ काम नहीं करेगा। गज़िप, रीडायरेक्ट आदि)। तो वोल्फ्राम एक स्पष्ट विजेता है। एक अन्य समाधान जो आकार और पठनीयता के संदर्भ में करीब आता है, वह है PowerShell (टिप्पणियों से सुधार के साथ), लेकिन इस पर अधिक ध्यान नहीं दिया गया है। मुख्यधारा की भाषाएँ ( पायथन , C # ) बहुत करीब आ गईं।


43
प्रत्येक अपने स्वयं के लिए, मुझे बदतर कहा जाता है। यदि ओपी का लक्ष्य प्रयास नहीं करना था और किसी तरह यह साबित करना था कि स्ट्रॉस्ट्रुप गलत है, तो मैं आपके आकलन से सहमत हूं। लेकिन सवाल का पूरा आधार यह दिखाना है कि "आपकी पसंदीदा भाषा" किस तरह से कोड की इस 50 पंक्तियों को कोड की बहुत कम लाइनों में कर सकती है। समस्या यह है कि कोई भी उदाहरण एक ही काम नहीं करता है। विशेष रूप से, कोई भी उत्तर किसी भी त्रुटि की जाँच नहीं करता है, कोई भी उत्तर पुन: प्रयोज्य कार्य प्रदान नहीं करता है, अधिकांश उत्तर पूर्ण कार्यक्रम प्रदान नहीं करते हैं। Stroustrup उदाहरण उस सभी को प्रदान करता है।
डंक

19
क्या दुख की बात है कि उसका वेब पेज UTF-8 भी मान्य नहीं है । अब मैं उसके सर्वर विज्ञापन के बावजूद, उसके आसपास काम Content-Type: text/html; charset=UTF-8करूँगा ... मैं उसे ईमेल करने वाला हूँ।
कॉर्न्स्टलक्स Corn

27
@ डंक अन्य उदाहरण पुन: प्रयोज्य कार्य प्रदान नहीं करते हैं क्योंकि वे उन कार्यों की संपूर्ण कार्यक्षमता को एक ही पंक्ति में पूरा करते हैं और इसका कोई मतलब नहीं है कि यह पूरी तरह से कार्य करता है, और C ++ उदाहरण कोई त्रुटि जाँच नहीं करता है यह लगभग एक समान तरीके से मूल रूप से संभाला नहीं है, और वाक्यांश "पूरा कार्यक्रम" लगभग अर्थहीन है।
जेसन

16
"आप किसी भी भाषा का उपयोग कर सकते हैं, लेकिन किसी भी तृतीय-पक्ष लाइब्रेरी की अनुमति नहीं है।" मुझे लगता है कि एक निष्पक्ष विचार आवश्यकता है नहीं लगता कि boost/asioवहाँ जो प्रयोग किया जाता है है एक तीसरी पार्टी पुस्तकालय। मेरा मतलब है कि ऐसी भाषाएँ कैसे शामिल होंगी जो अपने मानक पुस्तकालय प्रतियोगिता के भाग के रूप में url / tcp लाने में शामिल नहीं हैं?
महानवमी

जवाबों:


115

Wolfram

ऐसा लगता है कि पूरा धोखा

Import["http://www.stroustrup.com/C++.html", "Hyperlinks"]

तो बस शीर्ष पर कुछ ईमानदार पार्सिंग जोड़ें

Cases[
 Import["http://www.stroustrup.com/C++.html", "XMLObject"],
 XMLElement["a", {___, "href" -> link_, ___}, ___] :> 
  link /; StringMatchQ[link, RegularExpression["((http://)?www([./#\\+-]\\w*)+)"]]
, Infinity]

49
नहीं, मुझे यहाँ कोई धोखा नहीं दिखाई दे रहा है। यह चुनौती आपकी सर्वश्रेष्ठ भाषा को सामने लाने के बारे में है। और वह पहली पंक्ति "छोटे और पठनीय" का प्रतीक है।
मार्टिन एंडर

एक जवाब जो एफ़टीपी लिंक को पकड़ने के बारे में मूर्खतापूर्ण तर्कों को अनदेखा कर सकता है। प्रतिभाशाली।
सेठ बैतिन S

इस सटीक समाधान की पेशकश करने के लिए यहां आया था, दूसरों को देखकर प्रसन्नता हुई और साथ ही इसकी सराहना की।
माइकल स्टर्न

@ मार्टिनबटनर उस मामले में आप पर विचार करना चाह सकते हैं। meta.codegolf.stackexchange.com/a/1078/12130
डेविड मुल्डर

6
@DavidMulder तकनीकी रूप से, लूपहोल वर्तमान में मान्य नहीं है, क्योंकि वोट टूटने + 41 / -21 है (और लूपहोल प्रश्न में कहा गया है कि लूपहोल्स स्वीकार किए जाते हैं यदि कम से कम दो बार अपवोट के रूप में) एक करीबी कॉल, भर्ती, लेकिन अभी भी। ;) इसके अलावा, यह एक लोकप्रियता प्रतियोगिता है, न कि एक कोड गोल्फ, और विशेष रूप से, यह एक पॉप-कॉन है जो यह दर्शाता है कि किसी दिए गए भाषा में यह कितनी आसानी से किया जा सकता है, यही कारण है कि मुझे लगता है कि खामियां वास्तव में लागू नहीं होती हैं यह चुनौती वैसे भी (चूंकि चुनौती मूल रूप से इसके लिए पूछती है)।
मार्टिन एंडर

115

सी ++

#include <boost/asio.hpp>
#include <regex>
#include <iostream>
int main() {
    std::string server = "www.stroustrup.com";
    std::string request = "GET http://" + server + "/C++.html HTTP/1.0\r\nHost: " + server + "\r\n\r\n";
    boost::asio::ip::tcp::iostream s{server, "http"};
    s << request;
    std::regex pat{R"((http://)?www([./#\+-]\w*)+)"};
    std::smatch m;
    for (std::string l; getline(s, l);)
        if (std::regex_search(l, m, pat))
            std::cout << m[0] << "\n";
}

मुख्य कमी को बढ़ावा देने की अजीब प्रकृति है :: asio, मुझे यकीन है कि यह एक बेहतर पुस्तकालय के साथ भी छोटा हो सकता है।


166
मजेदार है कि "कोई तृतीय-पक्ष लाइब्रेरी" का अर्थ है कि पायथन अभी भी हो सकता है import urllib2, सी 3 अभी भी हो सकता है using System.Net, हास्केल अभी भी हो सकता है import Network.HTTP, लेकिन एक सी ++ कोडर को #include <boost/asio.hpp>विशेष, उद्देश्य से निर्मित सी ++ (और सी) पुस्तकालयों के मीट्रिक क्रेपटन होने का बहाना बनाना चाहिए ! उपलब्ध में से कुछ को बस शर्मिंदा होना है क्योंकि समिति ने आपको एक विशिष्ट को खिलाने के लिए परेशान नहीं किया ...
DevSolar

19
@DevSolar लगभग एक 2 खाता बनाने के लिए गया था ताकि आप उस टिप्पणी के लिए एक और upvote दे सकें
उपयोगकर्ता

15
@DevSolar System.Netको मजबूर नहीं किया गया है, यह भाषा के साथ शामिल सभी .NET सिफारिशों के बाद सिर्फ एक उच्च-गुणवत्ता वाला पुस्तकालय है। वैकल्पिक कार्यान्वयन हैं, लेकिन मानक पुस्तकालय में HTTP समर्थन होने का मतलब है कि सरल एप्लिकेशन लिखना सरल है, तीसरे पक्ष के पुस्तकालयों के बीच बेहतर अंतर-साधन का मतलब है, कम निर्भरता का मतलब है, facades के लिए आसान कार्यान्वयन आदि के बिना दुनिया की std::stringकल्पना करें, कल्पना करें कि हर कोई कैसे उपयोग करता है। अपने स्वयं के पुस्तकालय, इसके साथ आने वाली सभी कठिनाइयों की कल्पना करें।
अठारी

17
@DevSolar: urllib2है नहीं 3 पार्टी। यह <iostream>C ++ की तरह stdlib में है। urllib2पायथन में C ++ के विपरीत हमेशा उपलब्ध होता है <boost/asio.hpp>। यदि हमें तीसरे पक्ष के मॉड्यूल का उपयोग करने की अनुमति दी गई थी; मैं पायथन में उपयोग करूंगा lxmlया करूंगा BeautifulSoup
jfs

22
इसके अलावा, मुझे लगता है कि यहाँ सबसे महत्वपूर्ण टिप्पणी यह ​​है कि C ++ अपनी मानक पुस्तकालयों में अन्य भाषाओं की तरह अधिक सामान का मानकीकरण नहीं करता है, लेकिन अभी भी बहुत सारे समान कार्यों के लिए व्यापक रूप से उपयोग किए जाने वाले पोर्टेबल पुस्तकालय हैं जो भाषाओं में मानक हैं अजगर की तरह, और इनमें से कुछ लिबास लगभग एक वास्तविक मानक हैं। और इसमें से कुछ C ++ का परिणाम है जो छोटे बायनेरिज़ और छोटे पुस्तकालयों के साथ एम्बेडेड सिस्टम को लक्षित करने में सक्षम है।
पीटर कॉर्डेस

85

लिनक्स / ओएस एक्स (कोई बाहरी उपयोगिताओं) पर शुद्ध बैश

HTTP क्लाइंट सॉफ्टवेयर कुख्यात रूप से फूला हुआ है। हम उन प्रकार की निर्भरता नहीं चाहते हैं। इसके बजाय हम एक टीसीपी स्ट्रीम के नीचे उपयुक्त हेडर को धक्का दे सकते हैं और परिणाम पढ़ सकते हैं। परिणाम पार्स करने के लिए grep या sed जैसी पुरातन उपयोगिताओं को कॉल करने की आवश्यकता नहीं है।

domain="www.stroustrup.com"
path="C++.html"
exec 3<> /dev/tcp/$domain/80
printf "GET /$path HTTP/1.1\r\nhost: %s\r\nConnection: close\r\n\r\n" "$domain" >&3
while read -u3; do
    if [[ "$REPLY" =~ http://[^\"]* ]]; then
        printf '%s\n' "$BASH_REMATCH"
    fi
done

मेह - मुझे लगता है कि यह अधिक पठनीय हो सकता है ...


1
जैसे यह पाइप के लिए यूनिक्स फाइल हैंडल का उपयोग करता है।
जवादबा j

2
वाह, कभी नहीं सोचा था कि कोई बाहरी बर्तन के बिना ऐसा कर सकता है। हालांकि ऐसा लगता है कि LFS पर मेरा बैश 3.2.17 एक छोटा सा अप्रचलित है, जो समर्थन नहीं करता है mapfile:)
रुस्लान

@ रुसलान येप, mapfileबैश 4.x के साथ आता है। एक ही बात एक while readपाश के साथ भी पूरी तरह से उल्लेखनीय है ।
डिजिटल ट्रामा

3
@Ruslan मैंने while readइसके बजाय इसे बदल दिया mapfile। अधिक पोर्टेबल और अधिक पठनीय, मुझे लगता है।
डिजिटल ट्रामा

1
OS X पर भी काम करता है!
एलेक्स कोहेन

65

अजगर २

import urllib2 as u, re
s = "http://www.stroustrup.com/C++.html"
w = u.urlopen(s)
h = w.read()
l = re.findall('"((http)s?://.*?)"', h)
print l

लंगड़ा, लेकिन काम करता है


9
क्यों नहीं उन कॉल का एक बहुत श्रृंखला? l = re.findall('"((http)s?://.*?)"', u.urlopen(s).read())
नकली नाम

13
यह छोटा है लेकिन यह मुहावरेदार नहीं है (पाइथन में पठनीयता)
jfs

24
हम्मम ... अगर मेरे सभी कोड ने इस उदाहरण की तरह त्रुटियों को नजरअंदाज कर दिया, तो मेरे काम का 75% से 90% पहले से ही हर प्रोजेक्ट पर काम करेगा।
डंक

20
@ डंक: मान लीजिए कि उदाहरण ने कुछ अपवाद (जैसे से urlopen()) को पकड़ लिया । इस तरह के अपवाद के साथ क्या करना चाहिए, दुर्घटना और मरने के अलावा अन्य क्या है? अगर यह किसी भी तरह से दुर्घटनाग्रस्त हो जाए और मर जाए, तो क्यों न केवल पायथन को दुर्घटनाग्रस्त और मरने से बचा लिया जाए, और पूरी तरह से अपवाद को छोड़ दिया जाए?
केविन

8
@Dunk: यदि मैं किसी और की पायथन कोड का उपयोग कर रहे थे, मैं बहुत चाहते बल्कि वे नहीं पकड़ने urlopenकी तुलना में (जैसे कि) उन्हें पकड़ने और फोन त्रुटियों sys.exit("something's borked!")। यदि वे बाद में करते हैं, तो मुझे पकड़ना होगा SystemExit, जो कभी भी मज़ेदार नहीं है।
केविन

55

सी#

using System;
using System.Net;
using System.Text.RegularExpressions;

class Program {
    static void Main() {
        string html = new WebClient().DownloadString("http://www.stroustrup.com/C++.html");
        foreach (Match match in Regex.Matches(html, @"https?://[^""]+"))
            Console.WriteLine(match);
    }
}

4
आप उपयोग कर सकते हैं var html, और शायद var matchकुछ पात्रों को शेव करने के लिए।
शानदार

15
@ सुपरब्रुक मैं नामों को एकल-वर्ण बना सकता है और htmlचर से पूरी तरह छुटकारा भी दिला सकता है, लेकिन ऐसा नहीं है कि मैं बाद में हूं।
अथारी


5
खैर, यह पठनीयता में सुधार करता है, भी। क्या कभी ऐसा कोई कारण नहीं है कि varजब यह कोड शब्दार्थ को प्रभावित नहीं करेगा?
20

6
@ सुपरबस्टर: "यह पठनीयता में सुधार करता है" व्यक्तिपरक है। व्यक्तिगत रूप से, मुझे लगता है कि स्पष्ट रूप से बताया जा रहा है कि चर का प्रकार पठनीयता में सुधार करता है (आमतौर पर, यहां इस कोड की तरह)। मैं इस पर बहस नहीं करना चाहता, हालाँकि; मैं केवल यह बताना चाहता हूं कि वैकल्पिक विचार मौजूद हैं।
कॉर्न्स्टलक्स

54

"नो थर्ड-पार्टी" एक पतन है

मुझे लगता है कि "कोई तीसरा पक्ष" धारणा एक गिरावट है। और एक विशिष्ट गिरावट है जो C ++ डेवलपर्स को प्रभावित करती है, क्योंकि C ++ में पुन: प्रयोज्य कोड बनाना बहुत कठिन है। जब आप कुछ भी विकसित कर रहे हैं, भले ही यह एक छोटी सी स्क्रिप्ट हो, तो आप हमेशा पुन: प्रयोज्य कोड के जो भी टुकड़े आपके लिए उपलब्ध हैं, उसका उपयोग करेंगे।

बात यह है कि पर्ल, पाइथन, रूबी (कुछ का नाम लेना) जैसी भाषाओं में, किसी और के कोड का पुन: उपयोग करना न केवल आसान है, बल्कि यह है कि अधिकांश लोग वास्तव में अधिकांश समय कोड कैसे लिखते हैं।

C ++, इसके लगभग असंभव-से-बनाए रखने के लिए-संगत-एबीआई-आवश्यकताओं के अनुसार यह बहुत कठिन काम है, आप बूस्ट जैसी परियोजना के साथ समाप्त होते हैं, जो कोड का एक राक्षसी भंडार है और इसके बाहर बहुत कम रचना है।

एक CPAN उदाहरण

बस इसके मज़े के लिए, यहाँ CPAN- आधारित उदाहरण दिया गया है, html के उचित पार्सिंग के साथ, html को पार्स करने के लिए रेगेक्स का उपयोग करने के बजाय

#!/usr/bin/perl
use HTML::LinkExtor;
sub callback {
   my ($tag, %links) = @_;
   print map { "$_\n" } values %links
}
$p = HTML::LinkExtor->new(\&callback, "http://www.stroustrup.com/C++.html");

6
3rd पार्टी लिबास के बिंदु को संबोधित करने के लिए अपवोट करें, लेकिन: बकवास, C ++ में पुन: प्रयोज्य कोड बनाना अन्य भाषा की तरह आसान चीज़ है। उपयोग करना और विशेष रूप से पुन: प्रयोज्य कोड ढूंढना थोड़ा कठिन हो सकता है, लेकिन केवल एक चीज जो गंभीर रूप से समस्याग्रस्त है वह संकलित कलाकृतियों का पुन: उपयोग कर रही है, लेकिन यह अक्सर पर्ल, आदि जैसे व्याख्या की गई भाषाओं में एक गैर-मुद्दा है
मार्टिन बा

4
एक सादृश्य को बढ़ाने के लिए, बूस्ट CPAN की तरह है - चुनें और चुनें। आप CPAN को "कोड का राक्षसी भंडार" नहीं कहते हैं, क्योंकि वहां बहुत सारा सामान है जिसका आप उपयोग नहीं करते हैं?
मार्टिन बा

22
CPAN 'कोड का एक राक्षसी भंडार' है, उन चार शब्दों की किसी भी उचित परिभाषा के द्वारा।
jwg

3
@MartinBa मैं असहमत हूं, C ++ एक संकलित भाषा है, इसके लिए निर्भरता के पूर्ण ढेर के पुनर्निर्माण के लिए प्रत्येक निष्पादन योग्य की आवश्यकता है क्योंकि एबीआई संगतता को बनाए रखना मुश्किल है कोड पुन: प्रयोज्य में बाधा। C ++ में एक पुन: प्रयोज्य पुस्तकालय का उत्पादन करने के लिए, आपको यह सुनिश्चित करने के लिए वास्तव में लंबी लंबाई से गुजरना होगा कि आप अपने आप को हर समय एबीआई-असंगत परिवर्तनों में मजबूर न करें।
डैनियल Ruoso

6
@MartinBa क्योंकि पूरे ब्रह्मांड को पुनर्निर्माण करने के लिए हर बार जब आप एक सरल कार्य को लागू करना चाहते हैं तो असहनीय होता है।
डैनियल Ruoso

47

UNIX शेल

lynx -dump http://www.stroustrup.com/C++.html | grep -o '\w*://.*'

एक ftp://लिंक भी ढूंढता है :)

एक और तरीका है, ://सिंटैक्स पर भरोसा किए बिना :

lynx -dump -listonly http://www.stroustrup.com/C++.html | sed -n 's/^[ 0-9.]\+//p'

38
मैं यह पता नहीं लगा सकता कि +1 करने के लिए क्योंकि वेब पेज को डाउनलोड करने के लिए वेब ब्राउज़र का उपयोग करना नौकरी के लिए या -1 के लिए सही उपकरण है क्योंकि चुनौती यह है कि ब्लाहब्लहब्लह करने के लिए एक प्रोग्राम लिखना है और आपने सिर्फ एक प्रोग्राम करना है ब्लाहिंग।
डेविड रिचेर्बी

2
मुझे लगता है कि लिंच को कर्ल या वेट से बदलना बेहतर है। वे आमतौर पर एक वेबपेज डाउनलोड करने के लिए उपयोग किए जाते हैं।
पावेल स्ट्रखोव

4
@PavelStrakhov मैं बनबिलाव बिल्कुल क्योंकि यह मेरे बिना लिंक डंप कर सकते हैं कर कुछ विशेष :) चुना है
रुस्लान

2
@SteveJessop "विशेष" से मेरा मतलब है वास्तव में पार्सिंग या रीजॉन्गिंग या जो भी हो। Lynx के साथ मैं केवल लिंक की सूची को बाहर निकालता हूं (जो कर्ल और विकट सूची नहीं करता है) और नंबरिंग को हटा दें। आप इसे धोखा दे सकते हैं या जो भी हो, लेकिन मैंने सोचा कि यह मजेदार है {उस टूल का उपयोग करें जो लगभग पूरी तरह से वही करता है जो आवश्यक है}, बस आउटपुट को ठीक करता है।
रुस्लान

7
"लेकिन किसी तीसरे पक्ष के पुस्तकालयों की अनुमति नहीं है" । मैं lynxइस परिदृश्य में तीसरे पक्ष के पुस्तकालय के बराबर कार्यात्मक हूं ।
डिजिटल ट्रॉमा

43

सीएसएस 3

* {
  margin: 0;
  padding: 0;
}
*:not(a) {
  font: 0/0 monospace;
  color: transparent;
  background: transparent !important;
}
a {
  content: "";
}
a[href*="://"]::after {
  content: attr(href);
  float: left;
  clear: left;
  display: block;
  font: 12px monospace;
  color: black;
}

इस कोड का उपयोग उपयोगकर्ता शैली के रूप में एक पृष्ठ पर केवल पूर्ण लिंक प्रदर्शित करने के लिए एक विकृत सूची में किया जा सकता है। यदि आपका ब्राउज़र न्यूनतम फ़ॉन्ट आकार लागू करता है तो यह सही तरीके से काम नहीं कर सकता है।

यह http://www.stroustrup.com/C++.html(नोट !importantपर background) सही ढंग से काम करता है । अधिक शैलियों के साथ अन्य पृष्ठों पर काम करने के लिए, इसे बढ़ाया जाना चाहिए (अधिक गुण रीसेट करें, महत्वपूर्ण के रूप में गुण चिह्नित करें आदि)।

वैकल्पिक संस्करण जिसमें हैश के साथ शुरू होने वाले इंट्रापेज लिंक को छोड़कर रिश्तेदार लिंक शामिल हैं (यह एक कठिन-कोडित पूर्ण लिंक पर निर्भर करता है, दुर्भाग्य से):

* {
  margin: 0;
  padding: 0;
}
*:not(a) {
  font: 0/0 monospace;
  color: transparent;
  background: transparent !important;
  float: none !important;
  width: auto !important;
  border: none !important;
}
a {
  content: "";
}
a::after {
  display: none;
}
a:not([href^="#"])::after {
  content: attr(href);
  float: left;
  clear: left;
  display: block;
  font: 12px monospace;
  color: black;
}
a:not([href*="://"])::after {
  content: "http://www.stroustrup.com/" attr(href);
}

16
यह सबसे खराब चीज है जिसे मैंने कभी देखा है। +1
एम्मेट आर।

1
यह सुंदर और पूरी तरह से भयानक है। +1
रिक्सी 15

36

Clojure

(->> (slurp "http://www.stroustrup.com")
     (re-seq #"(?:http://)?www(?:[./#\+-]\w*)+"))

27
Slurp ?! मुझे क्लोज़र सीखने की ज़रूरत है।
11684

10
@ 11,684 - Clojure का नाम भी मानक कार्य करता है spit, zipperऔर lazy-cat... :-)
बॉब जार्विस

2
वाह, मुझे लगता है कि यह एक नए साल का संकल्प देर से होने वाला है। @BobJarvis
11,684

30

Emacs लिस्प

(with-current-buffer (url-retrieve-synchronously "http://www.stroustrup.com/C++.html")
  (while (re-search-forward "https?://[^\\\"]*")
    (print (match-string 0))))

2
मैं थोड़ा असंतुष्ट हूं, यह देखते हुए कि यह कोड कितना कॉम्पैक्ट और उल्लेखनीय है, कि इसमें अधिक वोट नहीं हैं। बहुत बढ़िया।
स्पेसमोसे

28

स्काला

"""\"(https?://.*?)\"""".r.findAllIn(scala.io.Source.fromURL("http://www.stroustrup.com/C++.html").mkString).foreach(println)

8
एक पंक्ति में सब कुछ पैक करें - C ++ इसे भी कर सकते हैं
quetzalcoatl

किस बारे में ftp://ftp.research.att.com/pub/c++std/WP/CD2?
टोबियास किंजलर

22
@quetzalcoatl - यह एक अभिव्यक्ति है , न कि केवल एक पंक्ति। आप C ++ कोड से सभी पंक्ति विराम को हटा सकते हैं, लेकिन यह पूरे कार्य को एक ही अभिव्यक्ति में करने के समान नहीं है।
दाऊवें

4
@DaoWen: क्षमा करें, लेकिन अभिव्यक्ति-बनाम-लाइन शुरू करना मूर्खतापूर्ण है। कुछ फ़ंक्शनलर्स जोड़ें और C ++ आप इसे भी कर सकते हैं। लेकिन यह सिर्फ इस बात का सवाल है कि क्या लिबास को "दी गई" माना जाता है और इसका "शून्य कोड" होता है। यह इस तथ्य को नहीं बदलता है कि इसे एक लाइन में पैक करने से पठनीयता को नुकसान पहुंचता है। एक को अभी भी एक ही अभिव्यक्ति के रूप में रख सकते हैं और सिर्फ कुछ लाइनों में सुधार करने के लिए और कुछ और .. लाइन गिनती के अलावा कुछ भी नहीं ढीला करने के लिए इसे पुन: स्वरूपित करें। यही मेरा सवाल है। सिली पैकिंग - C ++ भी कर सकते हैं। यदि कोई "मूर्खतापूर्ण पैकिंग" बॉक्स से बाहर निकलना चाहता है, तो उसे पठनीयता के लिए कोड को प्रारूपित करना चाहिए, न कि लाइनकाउंट को।
quetzalcoatl

3
@quetzalcoatl टोबियास ने हमें इसका अनुसरण करने के लिए लिंक नहीं दिया। वह इस जवाब के लेखक से पूछ रहा था कि यह उसके परिणामों में क्यों नहीं था।
JLRishe

25

PHP 5

<?php
preg_match_all('/"(https?:\/\/.*?)"/',file_get_contents('http://www.stroustrup.com/C++.html'),$m);
print_r($m[1]);

5
सुझाए गए संपादन: '/"((http)s?://.*?)"/''|"((http)s?://.*?)"|'(वर्तमान में एक त्रुटि); निकालें array_unshift($m);(वर्तमान में एक त्रुटि, आप के array_shiftबजाय इसका मतलब है ); print_r($m);print_r($m[1]);(केवल उरलों का उत्पादन)।
प्राइमो

निश्चित, आपके इनपुट के लिए धन्यवाद
डेविड जू

@DavidXu को छोड़कर आपने इसे ठीक नहीं किया ...?
शाहर

अब इसका तय है।
डेविड जू

25

शक्ति कोशिका

सभी पूर्ण-योग्य URL (जावास्क्रिप्ट, CSS, आदि सहित) के लिए पाठ खोज :

[string[]][regex]::Matches((iwr "http://www.stroustrup.com/C++.html"), '\w+://[^"]+')

या केवल लंगर टैग में लिंक प्राप्त करने के लिए (सापेक्ष URL शामिल हैं):

(iwr "http://www.stroustrup.com/C++.html").Links | %{ $_.href }

टिप्पणियों से छोटे संस्करण:

(iwr "http://www.stroustrup.com/C++.html").Links.href
(iwr "http://www.stroustrup.com/C++.html").Links.href-match":"

6
अगर किसी को आश्चर्य होता है, iwrतो Invoke-WebRequest(PS3 +) के लिए एक उपनाम है ।
अठारह

8
आप पावरस्ले की उत्सुकता का दुरुपयोग संग्रह को समतल करने और करने के लिए कर सकते हैं: (iwr "http://www.stroustrup.com/C++.html").Links.href(या (iwr "http://www.stroustrup.com/C++.html").Links.href-match":"केवल पूर्ण यूआरआई के लिए)
मैथियास आर जेसेन

1
यह बहुत आसान है!
जस्टिन डनलप

22

डी

import std.net.curl, std.stdio;
import std.algorithm, std.regex;

void main() {
foreach(_;byLine("http://www.stroustrup.com/C++.html")
    .map!((a)=>a.matchAll(regex(`<a.*?href="(.*)"`)))
    .filter!("a")){ writeln(_.front[1]); }
}

सूची को मूल उदाहरण के समान बनाने के लिए, आप प्रोग्राम के आउटपुट को पाइप के माध्यम से | sort | uniqया इसके बजाय जोड़ सकते हैं import std.arrayऔर .filter!("a")){ writeln(_.front[1]); }इस में लाइन को बदल सकते हैं .filter!("a").map!(a => a.front[1]).array.sort.uniq){ writeln(_); }:। ध्यान दें, हालांकि, मैंने केवल इस कोड की कोशिश की है और इसे सही या "मुहावरेदार" साबित नहीं किया है। :)
फ्राग

22

Node.js

var http = require('http');

http.get('http://www.stroustrup.com/C++.html', function (res) {
    var data = '';
    res.on('data', function (d) {
        data += d;
    }).on('end', function () {
        console.log(data.match(/"https?:\/\/.*?"/g));
    }).setEncoding('utf8');
});

3
मुझे आश्चर्य है कि अगर require('http').getकाम करता है। यदि ऐसा होता है तो हम var स्टेटमेंट को खोद सकते हैं और दूसरी लाइन को छोटा कर सकते हैं।
अनहाइड्रोन

@ यूनीहेड्रो यह करता है।
टिमवॉला

9
@ यूनीहेड्रो यह करता है, लेकिन यह एक गोल्फ प्रतियोगिता नहीं है।
cPu1

आपको किसी भी कैप्चरिंग समूह का उपयोग करने की आवश्यकता नहीं है।
राय-

मुझे लगता है कि यह एक रूपरेखा नाम के बजाय जावास्क्रिप्ट है।
mr5

20

माणिक

require 'net/http'
result = Net::HTTP.get(URI.parse('http://www.stroustrup.com/C++.html'))
result.scan(/"((http)s?://.*?)"/)

1
आपका रेगेक्स विफल हो जाएगा, आपको उपयोग करने की आवश्यकता है %r{"(https?://[^"]+)"}। इसके अलावा, आप Net::HTTP.get('www.stroustrup.com', '/C++.html')अनुरोध को कम करने के लिए उपयोग कर सकते हैं (और इसे पठनीय रखें)। तो पूरा कोड एक पंक्ति में हो सकता है (इसे पठनीय रखना) puts Net::HTTP.get("www.stroustrup.com", "/C++.html").scan(%r{"(https?://[^"]+)"}):। इसे चलाएं ruby -rnet/httpऔर आपको require 'net/http'लाइन की भी आवश्यकता नहीं है ।
हौलेथ

20

हास्केल

"\w"Text.Regex.Posix में कुछ परेशानियाँ

import Network.HTTP
import Text.Regex.Posix
pattern = "((http://)?www([./#\\+-][a-zA-Z]*)+)"
site = "http://www.stroustrup.com/C++.html"

main = do
    file <- getResponseBody =<< simpleHTTP (getRequest site)
    let result = getAllTextMatches $ file =~ pattern
    putStr $ unlines result -- looks nicer

resultस्पष्ट रूप से निर्दिष्ट का प्रकार क्यों है ? में इसके उपयोग से पूरी तरह से विवश होना चाहिए unlines
जॉन ड्वोरक

1
यह नियम एक सा खिंचाव, के रूप में देख रहा है न करता Network.HTTPऔर न ही TextRegex.Posixमें हैं baseपैकेज। (हालांकि वे हास्केल प्लेटफ़ॉर्म में हैं, और हैकैज पर, निश्चित रूप से ...)
बंद हो गए

1
@JanDvorak, मैं ghci में लिखना शुरू करता हूं (शायद मुझे इसे अपरिवर्तित करना चाहिए)। लेकिन आपका नोट प्रासंगिक है, धन्यवाद।
वलसाचू

@leftaroundabout को नहीं पता था। ऐसा लगता है कि मैं नहीं कर सकता था, अगर आधार पैकेज का उपयोग किया था।
वलसाचू

networkbaseया तो नहीं है , इसलिए अपने स्वयं के सॉकेट बाइंडिंग को रोल करने के लिए सहेजें, बस इसके साथ करने का कोई व्यावहारिक तरीका नहीं है base
लैंबडा फेयरी

18

पीएचपी

जहां तक ​​मैं बता सकता हूं, अधिकांश आधुनिक PHP इंस्टॉलेशन DOM प्रोसेसिंग के साथ आते हैं, इसलिए यहां एक है जो वास्तव में HTML के अंदर एंकर को ट्रेस करता है:

foreach (@DOMDocument::loadHTMLFile('http://stroustrup.com/C++.html')->getElementsByTagName('a') as $a) {
    if (in_array(parse_url($url = $a->getAttribute('href'), PHP_URL_SCHEME), ['http', 'https'], true)) {
        echo $url, PHP_EOL;
    }
}

आंतरिक लूप को छोटा किया जा सकता है:

preg_match('~^https?://~', $url = $a->getAttribute('href')) && printf("%s\n", $url);

वास्तव में यह इस पर आना चाहता था (जैसा कि मेरा पहला उत्तर है)। आपने इसे पहले किया था, इसलिए यहां आपका +1 (एक त्रुटि प्रवण रेगेक्स का उपयोग नहीं करने के लिए) है! संकेत: आप एक लंगड़ा इस्तेमाल कर सकते हैं 1के बजाय trueके लिए in_arrayसख्त खोज। आप कोष्ठक को छोड़ सकते हैं। मैं पूरी तरह से निश्चित नहीं हूं, लेकिन iirc को आप छोड़ सकते हैं httpऔर केवल छोड़ सकते हैं ://(जा w / o स्कीम)। ।
केसर

और: इसके if ( ) {}पक्ष में एक और संभावना होगी in_array() and print $url.PHP_EOL। लेकिन हाँ, आपको सर्वोत्तम पठनीयता के लिए एक और +1 (यदि मैं मिल सकता है) मिल जाएगा :)
kaiser

बस अपने उदाहरण की कोशिश की और सख्त मानकों के लिए एक त्रुटि मिली (PHP 5.4)। स्रोत की तरह लगता है, कहीं न कहीं एक दूषित अर्धविराम के साथ एक दूषित या गलत रूप से स्वरूपित लिंक है। आप उपयोग करके त्रुटि रिपोर्टिंग को बंद कर सकते हैं @\DOMDocument। बस कोशिश की है और यह काम करता है की पुष्टि कर सकते हैं।
kaiser

नहीं, यह गलत है कि प्रलेखन है; तकनीकी रूप से आप ::loadHTMLFile()वैधानिक रूप से कॉल करने वाले नहीं हैं , और @केवल उस आड़े को छुपाता है।
जैक

2
यह निश्चित रूप से सबसे "सही" समाधानों में से एक है, केवल उन में से एक जो मैं उत्पादन में उपयोग में देख सकता था। अच्छा काम
जॉर्डन बियोन्डो

14

यूनिक्स शैल

wget -q -O - http://www.stroustrup.com/C++.html | sed -n '/http:/s/.*href="\([^"]*\)".*/\1/p' | sort

हालांकि मुझे यह स्वीकार करना होगा कि यदि एक पंक्ति में एक से अधिक लिंक हैं तो यह काम नहीं करता है।


1
curl http://www.stroustrup.com/C++.htmlकुछ पात्रों को बचाता है।
l0b0

7
"लेकिन किसी तीसरे पक्ष के पुस्तकालयों की अनुमति नहीं है" । मुझे लगता है कि चूंकि wgetGNU (जैसा कि बैश है), आप तर्क दे सकते हैं कि यह तृतीय-पक्ष नहीं है। लेकिन curlनिश्चित रूप से थर्ड-पार्टी है।
डिजिटल ट्रामा

के बारे में ftp://ftp.research.att.com/pub/c++std/WP/CD2और क्या https://www.youtube.com/watch?v=jDqQudbtuqo&feature=youtu.be?
टोबियास किंज़लर

4
@TobiasKienzler मुझे लगता है कि Stroustrup के मूल कोड उन्हें या तो नहीं मिल रहा है
रुस्लान

14

जावा

import java.util.regex.*;
class M{
    public static void main(String[]v)throws Throwable{
        Matcher m = Pattern.compile( "\"((http)s?://.*?)\"" )
            .matcher(
                 new Scanner(
                         new URL( "http://www.stroustrup.com/C++.html" )
                             .openStream(),
                         "UTF-8")
                     .useDelimiter("\\A")
                     .next());
        while(m.find())
            System.out.println(m.group());
    }
}

3
क्या आप अपने उत्तरों में ठीक से कोड प्रारूपित कर सकते हैं? यह कम से कम पठनीय कोड के लिए प्रतिस्पर्धा नहीं है। आप इसे कम से कम क्षैतिज स्क्रॉलबार से बचने के लिए प्रारूपित कर सकते हैं।
अथार्ी

यदि आप एक का उपयोग करते हैं, तो आप Scannerइसे सीधे लिंक के लिए रेगेक्स पैटर्न को संसाधित कर सकते हैं और Scannerपरिणामों पर पुनरावृति कर सकते हैं ।
होल्गर

5
हां .. वह तुम्हारे लिए जावा है। कोड गोल्फ के लिए इसका उपयोग करना एक बहादुर उपक्रम है।
जवादबा j

4
कभी नहीं सोचा था कि मैं एक जावा समाधान देखूंगा जो वास्तव में C ++ से कम है!
स्लीपबेटमैन

2
मेरी अंतिम टिप्पणी के लिए सुधार: मुझे यह स्वीकार करना चाहिए कि यह सबसे छोटा और सबसे साफ कोड है जो जावा में लिखा जा सकता है। I रेगेक्स जाने का एकमात्र रास्ता है।
मिस्टर स्मिथ

11

ग्रूवी

"http://www.stroustrup.com/C++.html".toURL().text.findAll(/https?:\/\/[^"]+/).each{println it}

का उपयोग करके सुधार किया जा सकता है। ऑपरेटर NPEs से बचने के लिए?
क्रिस के

2
@ChrisKaminski और त्रुटियों के लिए जाँच करने के लिए यहाँ (Bjarne के बगल में) पहला हो? कभी नहीँ! उसके बगल में: मैं केवल IO संबंधित अपवाद यहाँ देखता हूँ। आपको NPE कहाँ दिखाई देता है?
14

findAll () शून्य हो सकता है, नहीं? या यह एक खाली सूची लौटाएगा? अभी भी ग्रूवी के लिए थोड़ा नया है। EDIT: nm, findAll जैसा लगता है () एक खाली सूची देता है। उन Groovy लोग बहुत चालाक थे। :-)
क्रिस के

11

SQL (SQL कहीं भी 16)

वेब पेज लाने के लिए एक संग्रहीत कार्यविधि को परिभाषित करें

CREATE OR REPLACE PROCEDURE CPPWebPage()
URL 'http://www.stroustrup.com/C++.html'
TYPE 'HTTP';

एकल क्वेरी का उपयोग करके सेट किए गए परिणाम का उत्पादन करें

SELECT REGEXP_SUBSTR(Value,'"https?://[^""]+"',1,row_num) AS Link  
FROM (SELECT Value FROM CPPWebPage() WITH (Attribute LONG VARCHAR, Value LONG VARCHAR) 
      WHERE Attribute = 'Body') WebPage, 
      sa_rowgenerator( 1, 256 ) 
WHERE Link IS NOT NULL;

सीमाएं: यह 256 लिंक तक का उत्पादन करता है। यदि अधिक लिंक मौजूद हैं, तो 256 को एक उचित मूल्य पर टक्कर दें।


2
मुझे विश्वास नहीं था कि SQL में गोल्फ होगा ... अब तक।
vaxquis

मुझे मिल गया ... "लिंक"। :-)
जैक SAP कनाडा

10

CoffeeScript / NodeJS

require('http').get 'http://www.stroustrup.com/C++.html', (r) ->
    dt = '';
    r.on 'data', (d) -> dt += d
    r.on 'end' , (d) -> console.log dt.match /"((http)s?:\/\/.*?)"/g

1
मुझे लगता है कि यह CoffeeScript / Node है? मुझे लगता है कि आपको निर्दिष्ट करना चाहिए ...
जॉन ड्वोरक

वाह। यह बहुत पठनीय है।
मई को स्लीवेटमैन

@ स्लेबेटमैन निश्चित रूप से छोटा है, हालांकि
जॉन ड्वोरक

@slebetman हाँ CoffeeScript जावास्क्रिप्ट की तुलना में बहुत अधिक पठनीय है :) मुझे सभी घुंघराले ब्रेसों से छुटकारा पाने की खुशी थी :) :)
RobAu

9

पर्ल

use LWP;
use feature 'say';

my $agent = new LWP::UserAgent();
my $response = $agent->get('http://www.stroustrup.com/C++.html');

say for $response->content =~ m<"(https?://.+?)">g;

1
यदि आप फ़ील्ड-सेपरेटर और रिकॉर्ड-सेपरेटर वैरिएबल से बचते हैं तो कोड अधिक स्पष्ट होगा और बस: प्रिंट मैप {"$ _ \ n"} $ प्रतिक्रिया-> सामग्री = ~ m <"(https?: //.+) ?) "> जी;
डैनियल Ruoso

@DanielRuoso सहमत हुए।
प्रिमो

या भी use v5.10;और say for $response->content...
मार्क रीड

प्रत्येक अपने स्वयं को, मुझे लगता है। पिछले कुछ perl6 सुविधाओं में से कुछ समस्याग्रस्त हैं (स्मार्ट मिलान, मैं आपको देख रहा हूं), लेकिन sayकाफी उपयोगी है, और मेरे दिमाग में यहां स्पष्ट है। (इसके अलावा, पिछले 13 वर्षों में perl5 के बजाय पूरी तरह से असंबंधित-प्रति-प्रतिवाद में बहुत सुधार हुआ है; यह जांचने लायक हो सकता है।)
मार्क रीड

@MarkReed मैं सहमत हूं कि sayइस मामले में शायद अधिक पठनीय है, विशेष रूप से उन लोगों के लिए जो कम परिचित हैं।
प्राइमो

9

आर

html<-paste(readLines("http://www.stroustrup.com/C++.html"),collapse="\n")
regmatches(html,gregexpr("http[^([:blank:]|\\\"|<|&|#\n\r)]+",html))

... हालाँकि R मुख्य रूप से C में लिखा जाता है ... इसलिए R कोड की उन 2 लाइनों के पीछे शायद C कोड की कुछ पंक्तियाँ हैं।


2
यह (या कुछ इसी तरह का) यहाँ बहुत सारे उत्तरों के लिए सही है।
JLRishe

8

उद्देश्य सी

NSString *s;
for (id m in [[NSRegularExpression regularExpressionWithPattern:@"\"((http)s?://.*?)\"" options:0 error:nil] matchesInString:(s=[NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.stroustrup.com/C++.html"]])]){
    NSLog(@"%@",[s substringWithRange:[m range]]);
}

3
क्या? कृपया स्विफ्ट संस्करण लिखें। वह वर्ग ब्रैकेट बकवास मेरी आँखों को चोट पहुँचा रहा है :)
मिस्टर स्मिथ

2
[] के लिए हुर्रे! इसके अलावा, हमें पूरी तरह से एक
स्मालटॉक

@ मिस्टरस्मिथ स्विफ्ट का जवाब अब यहां उपलब्ध है
JAL

7

Tcl

package require http
set html [http::data [http::geturl http://www.stroustrup.com/C++.html]]
puts [join [regexp -inline -all {(?:http://)?www(?:[./#\+-]\w*)+} $html] \n]

आप पुट के अंदर http :: डेटा कर के दूर हो सकते हैं। कोई अस्थायी चर बनाने की आवश्यकता नहीं है। और मैं भी इसे हर जगह newlines और indenting डालकर प्रारूपित करता हूं [। लेकिन वह एक स्टाइल चॉइस है।
स्लीवेटमैन 2

7

जाओ

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
    "os"
    "regexp"
)

func main() {
    resp, err := http.Get("http://www.stroustrup.com/C++.html")
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        os.Exit(1)
    }
    defer resp.Body.Close()
    data, _ := ioutil.ReadAll(resp.Body)
    results := regexp.MustCompile(`https?://[^""]+`).FindAll(data, -1)
    for _, row := range results {
        fmt.Println(string(row))
    }
}

PS यह कोड पूरे स्रोत को मेमोरी में पढ़ता है, इसलिए regexp.FindReaderIndexस्ट्रीम में खोज करने के लिए उपयोग करने पर विचार करें, इससे ऐप बुलेटप्रूफ बन जाएगा।


6

CJam

CJam में regex नहीं है इसलिए मुझे इसमें एक अलग दृष्टिकोण का उपयोग करना पड़ा:

"http://www.stroustrup.com/C++.html"g''/'"*'"/(;2%{_"http://"#!\"https://"#!e|},N*

मैं सबसे पहले सभी 'को परिवर्तित करता "हूं, फिर मैं सभी में विभाजित हो जाता हूं" , हर वैकल्पिक स्ट्रिंग लेता और फिर अंत में उस सूची को फ़िल्टर करता जिसके साथ शुरू होता है http://याhttps:// । उसके बाद, बस प्रत्येक फ़िल्टर किए गए स्ट्रिंग को एक नई लाइन पर प्रिंट करें।

जावा दुभाषिया का उपयोग करके इसे आज़माएं की तरह

java -jar cjam-0.6.2.jar file.cjam

जहाँ file.cjam के ऊपर कोड की सामग्री है।


9
पठनीय भाग के बारे में नहीं जानते ... नहीं पता था कि Cjam की वेब कार्यक्षमता है
Def

यदि आप इसे गोल्फ करना चाहते हैं ... के ''/'"f/:+लिए ''/'"*'"/'"f/0f=
jimmy23013

... ठहरो क्यों है '"f/0f=? क्या ऐसा कुछ करना चाहिए ( 2%उदाहरण के लिए)?
jimmy23013

6

एफ #

यह कोड बहुत कम हो सकता है लेकिन मैं इस तरह से कुछ लिखूंगा अगर मुझे कभी भी इस कोड को फिर से पढ़ने या उपयोग करने की उम्मीद है तो इसमें कई अनावश्यक प्रकार के एनोटेशन हैं। यह मानक CLR प्रकार मैच के प्रति पैटर्न-मिलान को सक्षम करने के लिए एक सक्रिय पैटर्न MatchValue के उपयोग को प्रदर्शित करता है

open System.Net

let (|MatchValue|) (reMatch: Match) : string = reMatch.Value

let getHtml (uri : string) : string = 
    use webClient = WebClient() in
        let html : string = webClient.DownloadString(uri)
        html

let getLinks (uri : string) : string list =
    let html : string = getHtml uri
    let matches : MatchCollection = Regex.Matches(html, @"https?://[^""]+") 
    let links = [ for MatchValue reMatch in matches do yield reMatch ]
    links

let links = getLinks "http://www.stroustrup.com/C++.html" 
for link in links do
    Console.WriteLine(link)

संपादित करें मैंने getLinks का अपना कार्य किया है


मुझे वास्तव में पसंद है कि आपने किस प्रकार एनोटेशन का उपयोग किया है। मुझे लगता है कि आप जो भी रिटर्न देते हैं उसका वर्णन करने के लिए मानों का नामकरण ठीक है, लेकिन फ़ंक्शन का नाम काफी स्पष्ट है: getHTML और html मान, getLinks और लिंक मान। अंतिम दो पंक्तियाँ लिंक हो सकती हैं |> Seq.iter (प्रिंटफ़न "% s")
मीकलमा

@ मिचलम मैं सहमत हूं कि फ़ंक्शन का नाम अपने आप में पर्याप्त रूप से अभिव्यंजक है, html और लिंक चर व्यावहारिक कारणों से हैं: इसलिए कहीं न कहीं एक ब्रेकपॉइंट सेट करना है। मैंने List.iter के बजाय लूप के लिए उपयोग किया है क्योंकि मुझे यह पसंद है कि जिस तरह से यह अधिक पढ़ता है, हालांकि एक उत्तर में मैंने शायद List .iter का उपयोग किया होगा।
SourceSimian
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.