Как я могу локализовать переменные Perl в другом стековом фрейме?

Возможно, вы искали неверное значение атрибута class. Попробуйте приведенное ниже значение атрибута class.

from bs4 import BeautifulSoup as bs
import requests
import lxml

source = requests.get("https://github.com/bitcoin-dot-org/bitcoin.org/find/master").text
soup = bs(source, "lxml")
tbody = soup.find("tbody", class_= "js-tree-browser-result-template")
print(tbody)

Выход:

    <tbody class="js-tree-browser-result-template" hidden="">
    <tr class="js-navigation-item tree-browser-result">
    <td class="icon"><svg aria-hidden="true" class="octicon octicon-chevron-right" height="16" version="1.1" viewbox="0 0 8 16" width="8"><path d="M7.5 8l-5 5L1 11.5 4.75 8 1 4.5 2.5 3l5 5z" fill-rule="evenodd"></path></svg></td>
    <td class="icon"><svg aria-hidden="true" class="octicon octicon-file" height="16" version="1.1" viewbox="0 0 12 16" width="12"><path d="M6 5H2V4h4v1zM2 8h7V7H2v1zm0 2h7V9H2v1zm0 2h7v-1H2v1zm10-7.5V14c0 .55-.45 1-1 1H1c-.55 0-1-.45-1-1V2c0-.55.45-1 1-1h7.5L12 4.5zM11 5L8 2H1v12h10V5z" fill-rule="evenodd"></path></svg></td>
    <td>

<a class="css-truncate-target js-navigation-open js-tree-finder-path" href="/bitcoin-dot-org/bitcoin.org/blob/master"></a>
</td>
</tr>
</tbody>
24
задан brian d foy 14 October 2008 в 16:39
поделиться

6 ответов

Возможно, можно ли устроить код, который использует тех местных жителей, чтобы быть сгенерированным как закрытие? Затем Вы могли

sub run_with_env {
    my ($sub, @args) = @_;
    no warnings 'uninitialized';
    local %ENV = %ENV;
    local $/   = $/;
    local @INC = @INC;
    local %INC = %INC;
    local $_   = $_;
    local $|   = $|;
    local %SIG = %SIG;
    use warnings 'uninitialized';  
    $sub->(@args);
}

run_with_env(sub {
    # do stuff here
});

run_with_env(sub {
    # do different stuff here
});
30
ответ дан 28 November 2019 в 23:32
поделиться

Не уверенный, почему QuantumPete является downvoted, он, кажется, прав на этом. Вы не можете сказать local инициализировать переменные в блоке вызова. Его функциональность является особенной, и инициализация/разрушение, что она делает только работы над блоком, куда она была выполнена.

существуют некоторые экспериментальные модули такой как Sub:: Uplevel и Devel:: RunBlock, которые позволяют Вам пытаться "одурачить" caller() для подпрограмм или сделать 'возврат прыжка в длину' значений к более высоким стековым фреймам (соответственно), но ни один из них не делает ничего, чтобы влиять, как local переменные обработок (я попробовал.:)

Поэтому на данный момент, действительно похоже, что необходимо будет жить с локальными объявлениями в объеме, где Вам нужны они.

6
ответ дан 28 November 2019 в 23:32
поделиться

Я не ужасно знаком с Perl, поэтому простите мне, если это на самом деле возможно. Но обычно, переменные, локальные для стекового фрейма, только доступны в том стековом фрейме. Вы не можете получить доступ к ним или от более высокого или от более низкого одно (если Вы не сделаете некоторую hacky адресную арифметику с указателями, но это, как никогда гарантируют, не успешно выполнится). Большие блоки объявлений переменной - к сожалению, что-то, с чем необходимо будет жить.

QuantumPete

3
ответ дан 28 November 2019 в 23:32
поделиться

perldoc perlguts говорит:

   The "Alias" module implements localization of the basic types within
   the caller's scope.  People who are interested in how to localize
   things in the containing scope should take a look there too.

FWIW. Я не посмотрел на Alias.pm достаточно тесно, чтобы видеть, насколько легкий это могло бы быть.

3
ответ дан 28 November 2019 в 23:32
поделиться

В TCL можно использовать uplevel. Что касается Perl, я не знаю.

1
ответ дан 28 November 2019 в 23:32
поделиться

Perl имеет Sub:: Uplevel

0
ответ дан 28 November 2019 в 23:32
поделиться
Другие вопросы по тегам:

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