Удалить элементы с расширением точки из списка с использованием регулярного выражения или соответствия строк

Здесь является одним из хороших источников this в JavaScript.

Вот сводка:

  • global this In a браузер, в глобальной области, this является объектом window
    
    

    Если вы используете use strict;, в котором case this будет undefined

    
    

    Если вы вызываете функцию с new, this будет новым контекстом, он не будет ссылаться на глобальный this.

    
    
    • прототип этого

    Функции, которые вы создаете, становятся объектами функции. Они автоматически получают специальное свойство prototype, которое вы можете присвоить значениям. Когда вы создаете экземпляр, вызывая функцию с помощью new, вы получаете доступ к значениям, присвоенным свойству prototype. Вы получаете доступ к этим значениям с помощью this.

    function Thing() {
      console.log(this.foo);
    }
    
    Thing.prototype.foo = "bar";
    
    var thing = new Thing(); //logs "bar"
    console.log(thing.foo);  //logs "bar"
    

    Обычно ошибка заключается в назначении массивов или объектов на prototype. Если вы хотите, чтобы экземпляры каждого имели свои собственные массивы, создайте их в функции, а не в прототипе.

    function Thing() {
        this.things = [];
    }
    
    var thing1 = new Thing();
    var thing2 = new Thing();
    thing1.things.push("foo");
    console.log(thing1.things); //logs ["foo"]
    console.log(thing2.things); //logs []
    
    • object this

    Вы можете использовать this в любой функции объекта ссылаться на другие свойства этого объекта. Это не то же самое, что и экземпляр, созданный с помощью new.

    var obj = {
        foo: "bar",
        logFoo: function () {
            console.log(this.foo);
        }
    };
    
    obj.logFoo(); //logs "bar"
    
    • DOM event this

    В обработчике событий HTML DOM this всегда ссылается на элемент DOM, событие было присоединено к

    function Listener() {
        document.getElementById("foo").addEventListener("click",
           this.handleClick);
    }
    Listener.prototype.handleClick = function (event) {
        console.log(this); //logs "
    " } var listener = new Listener(); document.getElementById("foo").click();

    Если вы не bind контекст

    function Listener() {
        document.getElementById("foo").addEventListener("click", 
            this.handleClick.bind(this));
    }
    Listener.prototype.handleClick = function (event) {
        console.log(this); //logs Listener {handleClick: function}
    }
    
    var listener = new Listener();
    document.getElementById("foo").click();
    
    • HTML, этот

    Внутри атрибутов HTML, в которые вы можете поместить JavaScript, this является ссылкой на элемент.

    • eval this

    Вы можете использовать eval для доступа к this.

    function Thing () {
    }
    Thing.prototype.foo = "bar";
    Thing.prototype.logFoo = function () {
        eval("console.log(this.foo)"); //logs "bar"
    }
    
    var thing = new Thing();
    thing.logFoo();
    
    • с помощью этого

    Вы можете использовать with, чтобы добавить this в текущую область действия, чтобы читать и записывать значения на this, явно не ссылаясь на this.

    function Thing () {
    }
    Thing.prototype.foo = "bar";
    Thing.prototype.logFoo = function () {
        with (this) {
            console.log(foo);
            foo = "foo";
        }
    }
    
    var thing = new Thing();
    thing.logFoo(); // logs "bar"
    console.log(thing.foo); // logs "foo"
    
    • jQuery this

    jQuery во многих местах имеет this ссылается на элемент DOM.

1
задан Peter Lewerin 13 July 2018 в 17:01
поделиться

3 ответа

Метод 1 будет работать, если вы сделали это правильно. lsearch возвращает один результат по умолчанию, а критерии поиска принимают шаблон шара. Использование . будет искать только элемент, равный .. Затем вам понадобится цикл для lreplace:

set idx [lsearch -all $list1 "*.*"]
foreach id [lsort -decreasing $idx] {
    set list1 [lreplace $list1 $id $id]
}

Сортировка в порядке убывания важна, потому что индекс элементов будет меняться при удалении элементов (также обратите внимание, что вы использовали неправильное имя переменной в ваших фрагментах кода.


Метод 2 также будет работать, если вы использовали правильное регулярное выражение:

set b [regsub -all -line {.*\..*} $list1 ""]

Но в этом случае вы, вероятно, захотите обрезать результаты. .* будет соответствовать любым символам, кроме новой строки.


Я бы использовал, например, lsearch , что позволяет избежать необходимости замены:

set mylist [lsearch -all -inline -not $list1 "*.*"]
]
1
ответ дан Jerry 17 August 2018 в 12:45
поделиться

В качестве альтернативы, отфильтруйте список для непринятых элементов, используя lmap (или явный цикл, используя foreach):

lmap el $list1 {if {[string first . $el] >= 0} {continue} else {set el}}

См. также соответствующее обсуждение фильтрующих списков, например lmap` для фильтрации списка строк

1
ответ дан mrcalvin 17 August 2018 в 12:45
поделиться
  • 1
    Это должно быть set el, а не set $e1 ... – Peter Lewerin 13 July 2018 в 16:38
  • 2
    Thx для улова (слева от использования string cat раньше). – mrcalvin 13 July 2018 в 21:11

Команда lsearch имеет множество опций, некоторые из которых могут помочь сделать эту задачу довольно простой:

lsearch -all -inline -not $list1 *.*
1
ответ дан Schelte Bron 17 August 2018 в 12:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: