Я знаю, что это старый пост, но вот что я разработал, не найдя никакого жизнеспособного решения.
Решение использует 20 наиболее распространенных слов в языке, подсчитывает вхождения в стоге сена. Затем он просто сравнивает количество первых и вторых наиболее просчитанных языков. Если номер занявший второе место составляет менее 10% от победителя, победитель получает все.
Кодекс - любые предложения по улучшению скорости приветствуются!
function getTextLanguage($text, $default) {
$supported_languages = array(
'en',
'de',
);
// German word list
// from http://wortschatz.uni-leipzig.de/Papers/top100de.txt
$wordList['de'] = array ('der', 'die', 'und', 'in', 'den', 'von',
'zu', 'das', 'mit', 'sich', 'des', 'auf', 'für', 'ist', 'im',
'dem', 'nicht', 'ein', 'Die', 'eine');
// English word list
// from http://en.wikipedia.org/wiki/Most_common_words_in_English
$wordList['en'] = array ('the', 'be', 'to', 'of', 'and', 'a', 'in',
'that', 'have', 'I', 'it', 'for', 'not', 'on', 'with', 'he',
'as', 'you', 'do', 'at');
// clean out the input string - note we don't have any non-ASCII
// characters in the word lists... change this if it is not the
// case in your language wordlists!
$text = preg_replace("/[^A-Za-z]/", ' ', $text);
// count the occurrences of the most frequent words
foreach ($supported_languages as $language) {
$counter[$language]=0;
}
for ($i = 0; $i < 20; $i++) {
foreach ($supported_languages as $language) {
$counter[$language] = $counter[$language] +
// I believe this is way faster than fancy RegEx solutions
substr_count($text, ' ' .$wordList[$language][$i] . ' ');;
}
}
// get max counter value
// from http://stackoverflow.com/a/1461363
$max = max($counter);
$maxs = array_keys($counter, $max);
// if there are two winners - fall back to default!
if (count($maxs) == 1) {
$winner = $maxs[0];
$second = 0;
// get runner-up (second place)
foreach ($supported_languages as $language) {
if ($language <> $winner) {
if ($counter[$language]>$second) {
$second = $counter[$language];
}
}
}
// apply arbitrary threshold of 10%
if (($second / $max) < 0.1) {
return $winner;
}
}
return $default;
}
You can run PowerShell on Linux via Pash. It uses Mono the way PowerShell uses .NET.
You do realize bash 4
has very recently been released with a load of new features and language additions?
globstar
(**/foo
) does a recursive search, dirspell
fixes typos during pathname expansion.autocd
shell option allows changing directories by just typing the directory path instead of having to put cd
in front.&>>
and |&
redirection operators that redirect both stdout
and stderr
Check out:
Я думаю, что "исходная улучшенная оболочка" - это ksh93 . bash появился в то время, когда исходный код ksh был проприетарным; если бы тогда ksh был с открытым исходным кодом, возможно, не было бы необходимости иметь новую оболочку (хотя с FSF вы никогда не узнаете). ksh стоит изучить, особенно из-за его способности расширяться с помощью модулей C, но это не явная победа над bash. Автозаполнение bash явно превосходит его, что может быть достаточно, чтобы в целом bash выиграл. В любом случае bash и ksh приложили значительные усилия для схождения, поэтому различия незначительны.
Другая интересная оболочка - zsh , которая пытается быть всем, что есть ksh, но в то же время включает csh. Поскольку я никогда не видел смысла или использования csh, я не тот человек, который защищает zsh. Я отмечу одну необычную несовместимость: по умолчанию в zsh переменная $ var
всегда расширяется до одного токена, даже если она содержит пробелы. Это поведение несовместимо со всеми другими оболочками, производными от sh, и иногда оно неудобно, но на самом деле оно имеет гораздо больше смысла, чем оригинал, и избавляет от утомительного цитирования.
csh была первой оболочкой, которая есть контроль работы, но, на мой взгляд, он (и его последователи) был заменен bash и ksh. Писать сценарии никогда не было особенно весело.
Наконец, есть много крошечных оболочек, предназначенных для спасательных дискет (!) И других спартанских сред, но похоже, что вас они мало интересуют.
(В этом вопросе) Из нововведений я должен добавить, что более половины сценариев, которые я писал в качестве сценариев оболочки, теперь являются сценариями Lua . Другие могли сказать то же самое для Python или Ruby, а в свое время Perl или Tcl. Так что я думаю, что настоящее нововведение - это переход от оболочки для программируемого взаимодействия в командной строке.)
Может быть интересно добавить несколько фигур Linux / Mac в смесь?
Я знаю Ubuntu идет с Mono , установленным по умолчанию с версии не ниже 8.04
и пусть оболочка запускает их как встроенные.Допустим, вы пишете загружаемое 'on' ... и хотите, чтобы он работал так:
on node 123 run some command
on class nodes run some command
on all nodes run some command
... и т. д.
Вы можете следовать простым примерам на как написать загружаемый файл, а затем включить его как встроенный в bash через enable -f / path / to / loadable loadable_name
Итак, в нашем случае, enable -f / opt / bash / loadables / on
.. . в вашем bashrc, и он у вас есть.
Итак, если вы хотите, чтобы bash изначально интерпретировал ваш элегантный новый язык, вы должны написать загружаемый файл с именем 'use' или 'switch_to', а затем изменить синтаксический анализатор для загрузки другая грамматика / время выполнения, если была установлена определенная переменная среды.
То есть:
#/bin/bash
switch_to my-way-cool-language
funkyfunc Zippy(int p) [[
jive.wassup(p) ]]
Однако большинство людей не захотят взломать свою оболочку. Я действительно хотел указать, что существуют средства, позволяющие взять Bash и сделать его таким, каким вы его хотите, не возясь с основным кодом.
См. / path-to-bash-source / examples / loadables, вы можете заставить его летать, где бы вы ни работали, поскольку вы все еще используете Bash.
IIRC, Powershell является объектно-ориентированным, тогда как большинство оболочек и утилит unix работают с текстом. В связи с этим вас может заинтересовать Squirrel Shell . Но я никогда им не пользовался.
If you’re willing to lose sh
compatibility, you could look at using a scripting language like Python or Tcl as your shell. rlwrap
can be very handy if the interpreter doesn't provide line editing, command history, completion, etc.
One philosophy regarding shells is that they should primarily only be used to connect processes with files (here is one page that espouses that approach). That said, people have written some remarkably complex software using them.