"সি ++ কেবলমাত্র বৃহত্তর, জটিল, শুধুমাত্র প্রোগ্রামগুলির জন্য"


161

স্ট্রাস্ট্রাপ সম্প্রতি সি ++ সম্পর্কে জনপ্রিয় মিথগুলি ছড়িয়ে দিয়ে বেশ কয়েকটি পোস্ট পোস্ট করেছে । পঞ্চম পৌরাণিক কাহিনীটি হ'ল: "সি ++ কেবলমাত্র বৃহত্তর, জটিল, শুধুমাত্র প্রোগ্রামগুলির জন্য"। এটি নিষ্ক্রিয় করতে, তিনি একটি সাধারণ সি ++ প্রোগ্রাম লিখেছিলেন যা একটি ওয়েব পৃষ্ঠা ডাউনলোড করে এবং এ থেকে লিঙ্কগুলি বের করে । এটা এখানে:

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

আপনি যে কোনও ভাষা ব্যবহার করতে পারেন, তবে কোনও তৃতীয় পক্ষের লাইব্রেরি অনুমোদিত নয়।

বিজয়ী

সি ++ উত্তর ভোটে জিতেছে, তবে এটি অর্ধ-তৃতীয় পক্ষের লাইব্রেরিতে নির্ভর করে (যা নিয়ম দ্বারা অনুমোদিত নয়), এবং আরও একটি নিকট প্রতিদ্বন্দ্বী বাশের সাথে হ্যাক করা একসাথে এইচটিটিপি ক্লায়েন্টের উপর নির্ভর করে (এটি এইচটিটিপিএস দিয়ে কাজ করবে না, জিজিপ, পুনর্নির্দেশগুলি ইত্যাদি)। সুতরাং ওল্ফ্রাম একটি স্পষ্ট বিজয়ী। আকার এবং পঠনযোগ্যতার দিক থেকে আরও একটি সমাধান যা পাওয়ারশেল (মন্তব্যগুলির উন্নতির সাথে) কাছে আসে তবে এটি তেমন মনোযোগ পায়নি। মূলধারার ভাষা ( পাইথন , সি # ) খুব কাছে এসেছিল came


43
প্রত্যেকের নিজের কাছেই আমাকে আরও খারাপ বলা হয়েছে। যদি ওপি'র লক্ষ্য চেষ্টা না করা এবং কোনওভাবে প্রমাণ করা না যে স্ট্রোস্ট্রাপ ভুল, তবে আমি আপনার মূল্যায়নের সাথে একমত হই। তবে প্রশ্নের সম্পূর্ণ ভিত্তিটি দেখানো হয় যে "আপনার পছন্দসই ভাষা" কোডটির অনেক কম লাইনে সি ++ এর এই 50 টি লাইনের মতো একই কাজ করতে পারে। সমস্যাটি হ'ল উদাহরণগুলির মধ্যে একটিও একই কাজ করে না। বিশেষত, উত্তরগুলির মধ্যে কোনও ত্রুটি পরীক্ষা করে না, কোনও উত্তরই পুনরায় ব্যবহারযোগ্য ফাংশন সরবরাহ করে না, বেশিরভাগ উত্তর একটি সম্পূর্ণ প্রোগ্রাম সরবরাহ করে না। স্ট্রাস্ট্রাপের উদাহরণটি সমস্ত সরবরাহ করে।
ডঙ্ক

19
সবচেয়ে দুঃখজনক বিষয় হ'ল তার ওয়েব পৃষ্ঠাটি বৈধ ইউটিএফ -8 নয় । সার্ভারের বিজ্ঞাপন থাকা সত্ত্বেও আমি এখন সেদিকে কাজ Content-Type: text/html; charset=UTF-8করব ... আমি তাকে ইমেল করব।
কর্নস্টালক

27
@ ডাঙ্ক অন্যান্য উদাহরণগুলি পুনরায় ব্যবহারযোগ্য ফাংশন সরবরাহ করে না কারণ তারা সেই ফাংশনগুলির সম্পূর্ণ কার্যকারিতা একটি লাইনেই সম্পন্ন করে এবং এটি একটি সম্পূর্ণ ফাংশনটি তার নিজের করে তোলে তা বোঝা যায় না এবং সি ++ উদাহরণ কোনও ত্রুটি পরীক্ষা করে না এটি প্রায় অভিন্ন পদ্ধতিতে স্থানীয়ভাবে পরিচালিত হয় না এবং "সম্পূর্ণ প্রোগ্রাম" শব্দটি প্রায় অর্থহীন।
জেসন 21

16
"আপনি যে কোনও ভাষা ব্যবহার করতে পারেন, তবে কোনও তৃতীয় পক্ষের লাইব্রেরি অনুমোদিত নয়।" আমি যে একটি ন্যায্য বিবেচনা করা প্রয়োজন মনে করি না boost/asioসেখানে যা সম্পূর্ণভাবে ব্যবহার করা হবে হয় একটি তৃতীয় পক্ষের গ্রন্থাগার। আমি বলতে চাইছি যে ভাষাগুলিতে এর মানক লাইব্রেরির অংশ হিসাবে url / tcp আনার অন্তর্ভুক্ত নেই সেগুলি কীভাবে প্রতিযোগিতা করবে?
গ্রেটওয়ल्फ

উত্তর:


115

উল্ফর্যাম

এটি সম্পূর্ণ প্রতারণার মতো অনুভব করে

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
না, আমি এখানে কোনও প্রতারণা দেখছি না। এই চ্যালেঞ্জটি আপনার ভাষার সেরাটি প্রকাশের বিষয়ে। এবং সেই প্রথম লাইনটি "ছোট এবং পঠনযোগ্য" এর প্রতিচ্ছবি it
মার্টিন এন্ডার

এমন একটি উত্তর যা এফটিপি লিঙ্কগুলি ধরা সম্পর্কে মূর্খ যুক্তি উপেক্ষা করতে পারে। উজ্জ্বল।
শেঠ বটিন

এই সঠিক সমাধানটি দিতে এখানে এসেছেন, অন্যরাও এটির প্রশংসা করেছে দেখে সন্তুষ্ট।
মাইকেল স্টারন

@ মার্টিনব্যাটনার সে ক্ষেত্রে আপনি মেটা কোডেগডগলফস্ট্যাকেক্সচেঞ্জ
ডেভিড মুল্ডার

6
@ ডেভিড মল্ডার প্রযুক্তিগতভাবে, লুফোলটি বর্তমানে বৈধ নয়, যেহেতু ভোট বিচ্ছেদ +১১ / -২১ (এবং লুফোলের প্রশ্নে বলা হয়েছে যে ডাউনভোটের তুলনায় কমপক্ষে দ্বিগুণ ব্যতীত যদি লুফোলগুলি গৃহীত হয়)। একটি নিকটে কল, স্বীকার করা, কিন্তু এখনও। ;) তদ্ব্যতীত, এটি একটি জনপ্রিয়তা প্রতিযোগিতা, কোনও কোড গল্ফ নয় এবং বিশেষত, এটি একটি নির্দিষ্ট ভাষায় এটি কীভাবে করা যায় তা সহজেই দেখানো সম্পর্কে একটি পপ-কন, যার কারণ আমি মনে করি যে লুফোলটি সত্যিকার অর্থে প্রয়োগ হয় না doesn't এই চ্যালেঞ্জ যেভাবেই হোক (যেহেতু চ্যালেঞ্জটি মূলত এটির জন্য জিজ্ঞাসা করে)।
মার্টিন এেন্ডার

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

মূল অসুবিধা হ'ল উদ্ভট প্রকৃতি: যেমন, আমি নিশ্চিত এটি আরও ভাল গ্রন্থাগারের সাথে আরও খাটো হতে পারে।


166
মজার বিষয় কীভাবে "তৃতীয় পক্ষের কোনও লাইব্রেরি নেই" অর্থ পাইথনটি এখনও থাকতে পারে import urllib2, সি 3 এখনও থাকতে পারে using System.Net, হাস্কেল এখনও থাকতে পারে import Network.HTTP, তবে সি ++ #include <boost/asio.hpp>কোডারকে অবশ্যই অজুহাত দেখাতে হবে যেন বিশেষায়িত, উদ্দেশ্য-নির্মিত সি ++ (এবং সি!) গ্রন্থাগারের মেট্রিক ক্র্যাপটন রয়েছে having যেটি বেছে নেওয়া হয়েছে তা লজ্জার কারণ হ'ল কারণ কমিটি আপনাকে নির্দিষ্ট কাউকে জোর করে খাওয়ানোর জন্য বিরক্ত করে না ...
দেবসোলার

19
@ ডেভসোলার প্রায়শই একটি দ্বিতীয় অ্যাকাউন্ট তৈরি করতে গিয়েছিল আপনাকে সেই মন্তব্যের জন্য আরও একটি উত্সাহ দিতে
ব্যবহারকারী

15
@ দেভসোলারকে System.Netবাধ্য করা হয়নি, ভাষার সাথে অন্তর্ভুক্ত সমস্ত নেট নেট প্রস্তাবনা অনুসরণ করে এটি কেবল একটি উচ্চ মানের লাইব্রেরি। বিকল্প বাস্তবায়নের হয়ে এসেছে, কিন্তু মান লাইব্রেরিতে HTTP- র সমর্থন থাকার মানে সহজ অ্যাপ্লিকেশান লেখার সহজ, তৃতীয় পক্ষের লাইব্রেরি মধ্যে আরো ভালো ইনটেরোপিরাবিলিটি মানে, কম নির্ভরতা মানে, যার মানে ফেসেড ইত্যাদি জন্য সহজ বাস্তবায়ন ছাড়া একটি বিশ্ব কল্পনা std::stringকল্পনা সবাই ব্যবহার তাদের নিজস্ব গ্রন্থাগার, এর সাথে আসা সমস্ত অসুবিধা কল্পনা করুন।
অথারি

17
@DevSolar: urllib2হয় না 3 য় পক্ষের। এটি <iostream>সি ++ এর মতো স্টাডলিবে রয়েছে । urllib2পাইথনে সর্বদা<boost/asio.hpp> সি ++ এর থেকে বিপরীতে পাওয়া যায় । যদি আমাদের তৃতীয় পক্ষের মডিউল ব্যবহার করার অনুমতি দেওয়া হয়; আমি পাইথনে lxmlবা ব্যবহার করব BeautifulSoup
jfs

22
এছাড়াও, আমি মনে করি এখানে সর্বাধিক গুরুত্বপূর্ণ মন্তব্যটি হ'ল সি ++ অন্যান্য মানের মতো তার স্ট্যান্ডার্ড লাইব্রেরিতে যতটা স্টাফিকে মানক করে না, তবে এখনও একই কাজের জন্য বহুল ব্যবহৃত শক্তিশালী পোর্টেবল লাইব্রেরি রয়েছে যা ভাষাগুলিতে স্ট্যান্ডার্ড are পাইথনের মতো এবং এর মধ্যে কয়েকটি লিবগুলি প্রায় একটি ডি-ফ্যাক্টো স্ট্যান্ডার্ড। এবং এর কয়েকটি সি -+ এর ফলে ছোট বাইনারি এবং ছোট লাইব্রেরি সহ এম্বেড থাকা সিস্টেমগুলিকে টার্গেট করতে সক্ষম হয়েছে।
পিটার কর্ডেস

85

লিনাক্স / ওএস এক্সে খাঁটি বাশ (কোনও বাহ্যিক উপযোগিতা নেই)

এইচটিটিপি ক্লায়েন্ট সফ্টওয়্যার কুখ্যাতভাবে ফুলে গেছে। আমরা এই জাতীয় নির্ভরতা চাই না। পরিবর্তে আমরা উপযুক্ত শিরোনামগুলিকে টিসিপি স্ট্রিমের নীচে ঠেকাতে পারি এবং ফলাফলটি পড়তে পারি। ফলাফলটি বিশ্লেষণের জন্য গ্রেপ বা সেডের মতো প্রত্নতাত্ত্বিক ইউটিলিটিগুলি কল করার দরকার নেই।

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
পাইপগুলির জন্য ইউনিক্স ফাইল হ্যান্ডলগুলি ব্যবহার করে এটি পছন্দ করুন।
জাভাদবা

2
বাহ, বাহ্যিক ব্যবহার ছাড়াই কেউ এটি করতে পারে তা কখনও ভাবেননি। যদিও এলএফএসে আমার বাশ ৩.২.১7 বলে মনে হচ্ছে এটি একটি সামান্য বিচলিত যাতে এটি সমর্থন করে না mapfile:)
রুসলান

@ রুসলান ইয়েপ, mapfileবাশ ৪.x নিয়ে আসে একই জিনিসটি while readলুপের সাথে পুরোপুরি করণীয় ।
ডিজিটাল ট্রমা

3
@Ruslan আমি এটা পরিবর্তিত while readপরিবর্তে mapfile। আরো বহনযোগ্য এবং আরও পঠনযোগ্য, আমি মনে করি।
ডিজিটাল ট্রমা

1
ওএস এক্সেও কাজ করে!
অ্যালেক্স কোহান

65

পাইথন 2

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
এটি সংক্ষিপ্ত তবে এটি
অলঙ্কৃত

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সম্পূর্ণরূপে ভেরিয়েবল থেকে মুক্তি পেতে পারি , তবে এটি পরে নয়।
আটারি

6
@ সুপ্রেস্ট কোড-গল্ফ নয় । : ডি
ক্রোলটান

5
ঠিক আছে, এটি পঠনযোগ্যতাও উন্নত করে। varএটি কোড শব্দার্থবিজ্ঞানের উপর প্রভাব ফেলবে না যখন কখনও ব্যবহার না করার কোনও কারণ আছে ?
সুপারবেস্ট

6
@ সুপর্বেষ্ট: "এটি পঠনযোগ্যতার উন্নতি করে" বিষয়গত। ব্যক্তিগতভাবে, আমি ভেরিয়েবলের ধরণকে স্পষ্টভাবে উল্লেখ করে পাঠযোগ্যতার উন্নতি করে বলে মনে করি (সাধারণত, এই কোডটির মতো এখানে)। যদিও আমি এই নিয়ে তর্ক করতে চাই না; আমি কেবল উল্লেখ করতে চাই যে বিকল্প মতামত বিদ্যমান।
কর্নস্টালক

54

"তৃতীয় পক্ষের নয়" একটি মিথ্যাবাদ

আমি "তৃতীয় পক্ষের" অনুমান একটি মিথ্যাবাদ বলে মনে করি। এবং এটি একটি নির্দিষ্ট ভ্রান্তি যা C ++ বিকাশকারীদেরকে ক্ষতিগ্রস্থ করে, যেহেতু C ++ এ পুনরায় ব্যবহারযোগ্য কোড করা এত কঠিন। আপনি যখন কোনও কিছু বিকাশ করছেন, তা যদি এটি একটি ছোট স্ক্রিপ্ট হয় তবে আপনি পুনরায় ব্যবহারযোগ্য কোডের টুকরো যা আপনার কাছে উপলভ্য তা আপনি সর্বদা ব্যবহার করবেন।

জিনিসটি হ'ল পার্ল, পাইথন, রুবি (কয়েকটি নাম দেওয়ার জন্য) মতো ভাষায় অন্য কারও কোডের পুনরায় ব্যবহার করা কেবল সহজই নয়, তবে বেশিরভাগ সময় লোকেরা আসলে বেশিরভাগ সময় কোড লেখেন।

সি ++ এর প্রায় অসম্ভব-বজায় রাখা-সামঞ্জস্যপূর্ণ-এবিআই-প্রয়োজনীয়তার সাথে এটি আরও শক্ততর কাজ করে যে আপনি বুস্টের মতো একটি প্রকল্পের সাথে সমাপ্ত হন, এটি কোডের একটি রাক্ষসী ভাণ্ডার এবং এর বাইরে খুব কম সামঞ্জস্যযোগ্যতা।

সিপিএএন উদাহরণ

এটির মজাদার জন্য, এখানে এইচটিএমএলকে যথাযথভাবে পার্সিংয়ের পরিবর্তে, এইচটিএমএলকে পার্স করার জন্য রেজেক্স ব্যবহার করার চেষ্টা না করে একটি সিপিএএন ভিত্তিক উদাহরণ পাওয়া যায়

#!/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
তৃতীয় পক্ষের libs এর পয়েন্টটি সম্বোধন করার জন্য আপভোট করুন, কিন্তু: বকাবকি, সি ++ এ পুনরায় ব্যবহারযোগ্য কোড তৈরি করা অন্যান্য ভাষার মতোই সহজ চিজি। ব্যবহার এবং বিশেষ করে খোঁজার পুনর্ব্যবহারযোগ্য কোড একটি বাচ্চা কঠিন, কিন্তু শুধুমাত্র জিনিস যে গম্ভীরভাবে সমস্যাযুক্ত পুনঃব্যবহার হয় হতে পারে কম্পাইল নিদর্শন, কিন্তু যে প্রায়ই পার্ল ইত্যাদি ব্যাখ্যা করা ভাষায় একটি অ-সমস্যা
মার্টিন Ba থেকে

4
একটি উপমা প্রসারিত করতে, বুস্টটি আরও বেশি সিপিএএন - চয়ন করুন এবং চয়ন করুন। আপনি CPAN কে "কোডের মনস্তাত্ত্বিক ভাণ্ডার" হিসাবে অভিহিত করেন না কেন আপনি সেখানে ব্যবহার করেন না এমন অনেকগুলি জিনিস আছে?
মার্টিন বা

22
CPAN হয় একটি 'কোডের বিকট সংগ্রহস্থলের', যারা চার কোনো শব্দের যুক্তিসংগত সংজ্ঞা দ্বারা।
jwg

3
@ মার্টিনবা আমি দ্বিমত পোষণ করছি, সি ++ একটি সংকলিত ভাষা হওয়ায় প্রতিটি নির্বাহী ব্যক্তিকে তার সম্পূর্ণ নির্ভরতা পুনরায় তৈরি করতে হবে কারণ এবিআইয়ের সামঞ্জস্যতা বজায় রাখা কঠিনভাবে কোড পুনরায় ব্যবহারযোগ্যতার পথে বাধা দেয়। সি ++ এ পুনরায় ব্যবহারযোগ্য লাইব্রেরি তৈরি করার জন্য আপনি নিজেকে সর্বদা ABI- বেমানান পরিবর্তনগুলিতে জোর করবেন না তা নিশ্চিত করার জন্য আপনাকে দীর্ঘতর দৈর্ঘ্যের মধ্য দিয়ে যেতে হবে।
ড্যানিয়েল রুসো

6
@ মার্টিনবা কারণ আপনি যখন কোনও সাধারণ কাজটি বাস্তবায়ন করতে চান তখন পুরো মহাবিশ্বকে পুনর্গঠন করা অসহনীয়।
ড্যানিয়েল রুসো

47

ইউনিক্স শেল

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
@ পাভেলস্ট্রাখভ আমি লিঙ্ককে ঠিক বেছে নিয়েছিলাম কারণ এটি আমার বিশেষ কিছু না করেই লিঙ্কগুলি ডাম্প করতে পারে :)
রুসলান

2
"বিশেষ" দ্বারা স্টিভ জেসপ বলতে বোঝাতে চাইছি আসলে পার্সিং বা রেজেক্সিং বা যা কিছু হোক। লিঙ্কের সাহায্যে আমি লিঙ্কগুলির তালিকাটি গ্রেপ করেছিলাম (যা কার্ল এবং উইজেট তালিকাবদ্ধ করে না) এবং নম্বরটি সরিয়ে ফেলুন। আপনি এটিকে প্রতারণা বা যাই হোক না কেন বিবেচনা করতে পারেন, তবে আমি ভেবেছিলাম the যে সরঞ্জামটি প্রায় পুরোপুরি প্রয়োজনীয়ভাবে যা করা হয় তা ব্যবহার করে fun কেবল আউটপুটকে সূক্ষ্ম-সুরকরণ।
রুসলান

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
রিকদেসি

36

Clojure

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

27
গবগব করে খাওয়া ?! আমার ক্লোজুরে শিখতে হবে
11684

10
@ 11684 - Clojure এছাড়াও নামে মান ফাংশন আছে spit, zipperএবং lazy-cat... :-)
বব জার্ভিস

2
বাহ, আমি মনে করি এটি নতুন বছরের রেজোলিউশন হতে চলেছে। @ BobJarvis
11684

30

ইমাস লিস্প

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

2
এই কোডটি কতটা সংক্ষিপ্ত এবং সুনির্দিষ্টভাবে পাঠযোগ্য, এই বিবেচনায় আমি কিছুটা হতাশ, তার বেশি ভোট নেই given সাবাশ.
স্পেসমুজ

28

scala

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

8
সবকিছুকে এক লাইনে প্যাক করুন - সি ++ এটিও করতে পারে
কোয়েটজলক্যাটল

কি হবে ftp://ftp.research.att.com/pub/c++std/WP/CD2?
টোবিয়াস কেইনজলার

22
@ কোয়েটজলকোটল - এটি কেবল একটি লাইন নয়, এটি একটি প্রকাশ । আপনি কেবল সি ++ কোড থেকে সমস্ত লাইন ব্রেকগুলি মুছতে পারেন, তবে এটি একক অভিব্যক্তিতে পুরো কাজটি করার মতো জিনিস নয়।
দাওওয়েেন

4
@ দাওওয়েইন: দুঃখিত, তবে এক্সেস এক্সপ্রেশন-বনাম-লাইনটি কেবল নির্বাক হয়ে যাচ্ছে। কিছু ফান্টেক্টর যুক্ত করুন এবং সি ++ আপনি এটিও করতে পারেন। তবে এটাই কেবল প্রশ্নটি যে লিবগুলি "মঞ্জুর" হিসাবে বিবেচিত হয় এবং "এর ভিতরে শূন্য কোড" থাকে। এটিকে পংক্তিটিকে হর্টের পঠনযোগ্যতার মধ্যে প্যাকিং করে তা পরিবর্তন করে না। কেউ এটিকে একটি একক অভিব্যক্তি হিসাবে এখনও রাখতে পারেন এবং লাইন গণনা ব্যতীত অন্য কিছুই অর্জন করতে এবং কেবল কয়েকটি লাইনে পুনরায় ফর্ম্যাট করতে পারেন। এটাই আমার বক্তব্য। মূর্খ প্যাকিং - সি ++ এটিও করতে পারে। যদি কেউ "সিলি প্যাকিং" বাক্স থেকে বেরিয়ে আসতে চান, তবে পাঠযোগ্যতার জন্য কোডটি লাইনকাউন্টের নয়, ফর্ম্যাট করা উচিত।
কোয়েটজলকোটল

3
@ কোয়েটজলকোটল টোবিয়াস আমাদের অনুসরণ করার জন্য লিঙ্কটি সেখানে রাখেনি। তিনি লেখককে এই উত্তরটি জিজ্ঞাসা করছিলেন কেন এটি তার ফলাফলগুলিতে হয়নি।
জেএলআরিশ

25

পিএইচপি 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]);(শুধুমাত্র ইউআরএল আউটপুট)।
প্রিমো

স্থির, আপনার ইনপুট জন্য ধন্যবাদ
ডেভিড Xu

@ ডেভিড এক্সু ব্যতীত আপনি এটি ঠিক করে নি ...?
শাহার

এখন এটি স্থির!
ডেভিড জু 19

25

শক্তির উৎস

সমস্ত সম্পূর্ণ-যোগ্য ইউআরএলগুলির জন্য পাঠ্য অনুসন্ধান (জাভাস্ক্রিপ্ট, সিএসএস ইত্যাদি):

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

বা শুধুমাত্র অ্যাঙ্কর ট্যাগগুলিতে লিঙ্কগুলি পেতে (আপেক্ষিক ইউআরএল অন্তর্ভুক্ত):

(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
আপনি PowerShell এর আগ্রহ অপব্যবহার পারে সংগ্রহের চেপ্টা, কি করতে: (iwr "http://www.stroustrup.com/C++.html").Links.href(অথবা (iwr "http://www.stroustrup.com/C++.html").Links.href-match":"শুধুমাত্র পরম কোনো URI এর জন্য)
ম্যাথিয়াস আর Jessen

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(_); }। নোট, তবে, আমি কেবল এই কোডটি চেষ্টা করেছি এবং এটি সঠিক বা "আইডোমেটিক" প্রমাণিত হয়নি not :)
ফ্র্যাগ

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কাজ করে। যদি এটি হয় তবে আমরা ভেরি স্টেটমেন্টটি খনন করতে পারি এবং অন্য একটি লাইন সংক্ষিপ্ত করতে পারি।
ইউনিহীড্রন

@ উনিহেড্রো এটি করে।
টিমওয়োল্লা

9
@ উনিহেড্রো এটি করে তবে এটি কোনও গল্ফিং প্রতিযোগিতা নয়।
cPu1

আপনার কোনও ক্যাপচারিং গ্রুপ ব্যবহার করার দরকার নেই।
রাই-

আমি মনে করি এটি ফ্রেমওয়ার্কের চেয়ে জাভাস্ক্রিপ্ট।
এমআর 5

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

Haskell,

"\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
@ জনডভোরাক, আমি জিসিসিতে লিখতে শুরু করি (সম্ভবত আমার এটি অপরিবর্তিত পোস্ট করা উচিত)। তবে আপনার নোট প্রাসঙ্গিক, ধন্যবাদ।
ভ্লাস্টাচু

@ বামদিক থেকে, জানেন না। দেখে মনে হচ্ছে আমি বেস প্যাকেজটি ব্যবহার না করে করতে পারতাম না।
ভ্লাস্টাচু

networkনেই baseপারেন, তাই আপনার নিজের সকেট বাইন্ডিং ঘূর্ণায়মান শুধু সঙ্গে এটি করার কোন ব্যবহারিক উপায় জন্য রক্ষা base
লাম্বদা পরী

18

পিএইচপি

আমি যতদূর বলতে পারি, বেশিরভাগ আধুনিক পিএইচপি ইনস্টলেশনগুলি ডিওএম প্রসেসিংয়ের সাথে আসে, সুতরাং এখানে 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কঠোর অনুসন্ধান। আপনি বন্ধনীগুলি বাদ দিতে পারেন। আমি পুরোপুরি নিশ্চিত নই, তবে আপনি ভালভাবে ড্রপ করতে পারেন httpএবং কেবল ছাড়তে পারেন ://(স্কিম ডাব্লু / ও ও)। ।
কায়সার

এবং: আরেকটি সম্ভাবনা হ'ল if ( ) {}পক্ষে যেতে হবে in_array() and print $url.PHP_EOL। তবে হ্যাঁ, আপনি আরও +1 পাবেন (যদি আমি পারতাম) সেরা পঠনযোগ্যতার জন্য :)
কায়সার

কেবলমাত্র আপনার উদাহরণ ব্যবহার করে কঠোর মানক (পিএইচপি 5.4) এর জন্য একটি ত্রুটি পেয়েছে। উত্সটির মতো দেখে মনে হচ্ছে, কোথাও কোথাও একটি অনুপস্থিত অর্ধেকলনের সাথে একটি দূষিত বা ভুল ফর্ম্যাট লিঙ্ক রয়েছে। আপনি ব্যবহার করে ত্রুটি প্রতিবেদন বন্ধ করতে পারে @\DOMDocument। এটি চেষ্টা করেছেন এবং এটি কাজ করে তা নিশ্চিত করতে পারেন।
কায়সার

না, এটি ডকুমেন্টেশন যা ভুল; প্রযুক্তিগতভাবে আপনি ::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
"তবে কোনও তৃতীয় পক্ষের লাইব্রেরি অনুমোদিত নয়" । আমার ধারণা, যেহেতু wgetজিএনইউ (যেমন বাশ), আপনি তর্ক করতে পারেন যে এটি তৃতীয় পক্ষ নয়। তবে curlঅবশ্যই তৃতীয় পক্ষ।
ডিজিটাল ট্রমা

কি ftp://ftp.research.att.com/pub/c++std/WP/CD2এবং https://www.youtube.com/watch?v=jDqQudbtuqo&feature=youtu.be?
টোবিয়াস কেইনজলার

4
@ তোবিয়াস কিইনজলার আমার ধারণা, স্ট্রাস্ট্রাপের মূল কোডটি তারা খুঁজে পায় না
রুসলান

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
হ্যাঁ .. এটি আপনার জন্য জাভা। কোড গল্ফের জন্য এটি ব্যবহার করা একটি সাহসী উদ্যোগ।
জাভাদবা

4
কখনও ভাবিনি যে আমি জাভা সমাধানটি দেখতে পাবো যা আসলে সি ++ এর চেয়ে ছোট!
slebetman

2
আমার শেষ মন্তব্যের সংশোধন: আমার অবশ্যই এটি স্বীকার করতে হবে যে এটি জাভাতে লেখা যেতে পারে যা সবচেয়ে সংক্ষিপ্ত এবং স্বচ্ছতম কোড। আমি একটি স্যাক্স পার্সার পদ্ধতির চেষ্টা করেছি, যা ল্যাম্বডাস দিয়ে আরও ছোট করা যেতে পারে, তবে ওয়েব পৃষ্ঠাটি এক্সএইচটিএমএল নয় এবং পার্সার ব্যতিক্রম ছোঁড়ে। রেজেক্স একমাত্র উপায়।
মিস্টার স্মিথ

11

খাঁজকাটা

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

ব্যবহার করে উন্নত করা যায়? এনপিইএস এড়াতে অপারেটর?
ক্রিস কে

2
@ ক্রিসকামিনস্কি এবং ত্রুটিগুলি যাচাই করার জন্য এখানে প্রথম (বজর্নের পাশে) হন? না! তার পাশে: আমি কেবলমাত্র এখানে সম্পর্কিত ব্যতিক্রমগুলি দেখতে পাচ্ছি। আপনি কোথায় একটি এনপিই দেখতে পাচ্ছেন?
সিএফ্রিক

সন্ধান করুন সমস্ত () নাল ফিরে আসতে পারে, না? নাকি এটি খালি তালিকা ফেরত দেবে? গ্রোভির কাছে এখনও কিছুটা নতুন। সম্পাদনা: এনএম, দেখায় মনে হচ্ছে সমস্ত () খালি তালিকা দেয়। এই গ্রোভি ছেলেরা এত স্মার্ট ছিল। :-)
ক্রিস কে

11

এসকিউএল (এসকিউএল কোথাও 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
আমি বিশ্বাস করি না এসকিউএল-তে এখন পর্যন্ত গল্ফ থাকবে ...
ভ্যাক্সকুইস

আমি এটি পেয়েছি ... "লিঙ্কগুলি"। :-)
এসএপি কানাডায় জ্যাক

10

কফিস্ক্রিপ্ট / নোডজেএস

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
আমার ধারণা এটি কফিস্ক্রিপ্ট / নোড? আমার মনে হয় আপনার এটি নির্দিষ্ট করা উচিত ...
জন ডিভোরাক

কি দারুন. এটি খুব পঠনযোগ্য।
slebetman

@ স্লেবেটম্যান এটি স্পষ্টতই ছোট যদিও
জন ডিভোরাক

@ স্লেবেটম্যান হ্যাঁ কফিস্ক্রিপ্ট জাভাস্ক্রিপ্টের চেয়ে অনেক বেশি পঠনযোগ্য :) আমি সমস্ত কোঁকড়ানো ধনুর্বন্ধনী থেকে মুক্তি পেয়ে খুশি হয়েছি} :)
রবউউ

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"} $ প্রতিক্রিয়া-> সামগ্রী = ~ এম <"(https?: //.+ ?) "> ছ;
ড্যানিয়েল রুসো

@ ড্যানিয়েলরুওসো এতে সম্মত হয়েছেন।
প্রিমো

অথবা এমনকি use v5.10;এবং say for $response->content...
মার্ক রিড

আমি প্রত্যেকে তার নিজের কাছে মনে করি। কিছু ব্যাকপোর্টেড পার্ল 6 বৈশিষ্ট্যগুলি সমস্যাযুক্ত হয়েছে (স্মার্ট মিল, আমি আপনাকে দেখছি) তবে sayএটি বেশ কার্যকর এবং আমার মনে এখানে পরিষ্কার are (এছাড়াও, গত ১৩ বছরে পার্ল ৫-এর তুলনায় সম্পূর্ণরূপে সম্পর্কযুক্ত-থেকে-পারল ismবাদের উন্নতি হয়েছে; এটি পরীক্ষা করে দেখার মতো হতে পারে))
মার্ক রিড

@ মারক্রেইড আমি একমত যে sayএই ক্ষেত্রে সম্ভবত আরও বেশি পঠনযোগ্য, বিশেষত পার্লের সাথে কম পরিচিতদের জন্য।
প্রিমো

9

আর

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

... যদিও আর লেখা থাকে মূলত সি তে ... তাই সম্ভবত আর কোডের কয়েকটি লাইন আর কোডের এই 2 লাইনের পিছনে।


2
এটি (বা অনুরূপ কিছু) এখানে সমস্ত উত্তরগুলির জন্য সত্য।
জেএলআরিশ

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
হুরের জন্য []! এছাড়াও, আমাদের পুরোপুরি একটি ছোট্ট সংস্করণ যুক্ত করা উচিত;)
বের্সেলর

@ মিস্টারস্মিথ সুইফট উত্তর এখন এখানে পাওয়া যায়
জাল

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 :: ডেটা করে পালিয়ে যেতে পারেন। একটি অস্থায়ী পরিবর্তনশীল তৈরি করার প্রয়োজন নেই। এবং আমি এটিকে সর্বদা নিউলাইন এবং ইনডেন্ট লাগিয়ে ফর্ম্যাট করব [। তবে এটি স্টাইলের পছন্দ।
slebetman

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

সিজেমে রেগেক্স নেই তাই আমাকে এইটিতে একটি ভিন্ন পদ্ধতির ব্যবহার করতে হয়েছিল:

"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
পঠনযোগ্য অংশটি সম্পর্কে জানেন না ... সিজমের ওয়েব কার্যকারিতা রয়েছে তা জানেন না
Def

যদি আপনি এটি গল্ফ করতে চান ... ''/'"f/:+জন্য ''/'"*'"/'"f/0f=
jimmy23013

... অপেক্ষা কর কেন '"f/0f=আছে? এটি কিছু করার কথা ( 2%উদাহরণস্বরূপ)?
জিমি 23013

6

এফ #

এই কোডটি আরও সংক্ষিপ্ত হতে পারে তবে আমি যদি এই কোডটি আবার পড়তে বা ব্যবহার করতে পারি বলে আশা করি তবে এটিতে অনেক অপ্রয়োজনীয় প্রকারের টিকা আছে। এটি স্ট্যান্ডার্ড সিএলআর টাইপ ম্যাচের বিপরীতে প্যাটার্ন-ম্যাচিং সক্ষম করার জন্য একটি সক্রিয় প্যাটার্ন ম্যাচওয়ালিউয়ের ব্যবহার প্রদর্শন করে

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)

সম্পাদনা আমি গেটলিংকের নিজস্ব ফাংশন তৈরি করেছি


আপনি টাইপ টীকাগুলি কীভাবে ব্যবহার করেছেন তা আমি সত্যিই পছন্দ করি। আমি মনে করি আপনি কী ফিরিয়েছেন তার বর্ণনা দেওয়ার জন্য নামকরণ মানগুলি ঠিক আছে, তবে ফাংশনটির নামটি যথেষ্ট পরিমাণে অভিব্যক্তিপূর্ণ: getHtml এবং এইচটিএমএল মান, getLinks এবং লিঙ্কগুলির মানটি পান। শেষ দুটি লাইন লিঙ্ক হতে পারে |> Seq.iter (printfn "% s")
মিশালমা

@ মিচালমা আমি সম্মত হই যে ফাংশনটির নামটি নিজস্বভাবে যথেষ্ট প্রকাশযোগ্য, এইচটিএমএল এবং লিঙ্কগুলির পরিবর্তনশীলগুলি ব্যবহারিক কারণে রয়েছে: সুতরাং ব্রেকপয়েন্ট নির্ধারণের জন্য কোথাও কোথাও আছে। আমি তালিকার পরিবর্তে লুপের জন্য ব্যবহার করেছি কারণ এটি আরও পড়ার পদ্ধতিটি আমার পছন্দ, যদিও একটি প্রতিবেদনে আমি সম্ভবত তালিকা.ইটার ব্যবহার করতাম।
সোর্সসিমিয়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.