Я должен вручную установить @ARGV Perl, таким образом, я могу использовать <>, чтобы открыть, просканировать, и закрыть файлы?

AnchorNode следует позе AugmentedImage, и поэтому вы не можете изменить localRotation или localPosition на этом узле. Из AnchorNode.setLocalRotation : «Установите локальное вращение этого узла , если он не привязан. »

Вы можете изменить локальное преобразование, введя промежуточный Узел:

                    val base = AnchorNode()
                    base.anchor = augmentedImage.createAnchor(augmentedImage.centerPose)

                    val node = Node()
                    node.setParent(base)
                    node.localPosition = Vector3(0f, 0f, augmentedImage.extentZ/2)
                    node.localRotation = Quaternion.axisAngle(Vector3(1.0f, 0f, 0f), -90f)
                    node.localScale = Vector3(augmentedImage.extentX, augmentedImage.extentZ, 0f)

                    node.renderable = renderable

5
задан brian d foy 17 January 2010 в 16:13
поделиться

5 ответов

По теме управления @ARGV - это определенно работает код, Perl, конечно, позволяет Вам делать это. Я не думаю, что это - хорошая привычка кодирования все же. Большая часть кода я видел, что использование, "в то время как (<>)" идиома использует его для чтения из стандартного входа, и это - то, что я первоначально ожидаю, что код сделает. Более читаемый шаблон мог бы быть должен открыться/закрыть каждый входной файл индивидуально:

foreach my $file (@files) {
    open FILE, "<$file" or die "Error opening file $file ($!)";
    my @lines = <FILE>;
    close FILE or die $!;

    foreach my $line (@file) {
        if ( $line =~ /$pattern/ ) {
            # do something here!
        }
    }
}

Это читало бы более легко в меня, хотя это - еще несколько строк кода. Perl позволяет Вам большую гибкость, но я думаю, что это делает его, что намного более важный для разработки собственного стиля в Perl это читаемо и понятно Вам (и Ваши коллеги, если это важно для Вашего кода/карьеры).

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

Удачи! Perl является забавой. :)

Править: Это, конечно, верно, что, если у него был очень большой файл, он должен сделать что-то более умное, чем прихлебывание всего файла в массив. В этом случае что-то вроде этого определенно было бы лучше:

while ( my $line = <FILE> ) {
    if ( $line =~ /$pattern/ ) {
        # do something here!
    }
}

Точка, когда я записал, "что Вы вряд ли встретитесь с ситуациями, в которых такой сценарий перенапрягает Ваши аппаратные средства", была предназначена для покрытия этого, извините для того, чтобы не быть более конкретной. Кроме того, у кого даже есть жесткие диски на 4 ГБ, уже не говоря о файлах на 4 ГБ?:P

Другое Редактирование: После просматривания Интернета на совете комментаторов я понял, что существуют жесткие диски, которые являются намного более крупными, чем 4 ГБ, доступные для покупки. Я благодарен за то, что комментаторы указывают на это и обещание в будущем, чтобы никогда когда-либо не попытаться записать саркастический комментарий к Интернету.

9
ответ дан 18 December 2019 в 13:20
поделиться

Я предпочел бы эту более явную и читаемую версию:

#!/usr/bin/perl -w 

foreach my $file (<$ARGV[0]/*>){
    open(F, $file) or die "$!: $file";
    while(<F>){
      # search for pattern
    }
    close F;
}

Но это должно также хорошо управлять @ARGV:

#!/usr/bin/perl -w 

@ARGV = <$ARGV[0]/*>;
while(<>){
    # search for pattern
}
3
ответ дан 18 December 2019 в 13:20
поделиться

Да, нормально корректировать список аргументов перед запуском'while (<>)'цикл; это было бы более близко безрассудно для корректировки его в то время как в цикле. При обработке аргументов опции, например, Вы обычно удаляете объекты из @ARGV; здесь, Вы добавляете объекты, но это все еще изменяет исходное значение @ARGV.

Это не делает разногласий, является ли код в подпрограмме или в 'основной функции'.

1
ответ дан 18 December 2019 в 13:20
поделиться

Предыдущие ответы касаются Вашего основного программирующего Perl вопроса скорее хорошо.

Таким образом позвольте мне прокомментировать базовый вопрос: Как найти шаблон в наборе файлов.

В зависимости от ОС могло бы иметь смысл называть специализированную внешнюю программу, говорить

grep -l <pattern> <path>

на Unix.

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

1
ответ дан 18 December 2019 в 13:20
поделиться

Большая проблема с тонкой настройкой @ARGV - то, что это - глобальная переменная. Кроме того, необходимо знать это while (<>) имеет специальные волшебные атрибуты. (читающий каждый файл в @ARGV или обработка STDIN если @ARGV пусто, тестируя на definedness, а не истину). Для сокращения волшебства, которое должно быть понято я избежал бы его, за исключением беглых заданий взлома.

Можно получить имя файла текущего файла путем проверки $ARGV.

Вы не можете понять это, но Вы на самом деле влияете на две глобальных переменные, не просто @ARGV. Вы также совершаете нападки $_. Это очень, очень хорошая идея локализовать $_ также.

Можно уменьшить влияние порчи globals при помощи local локализовать изменения.

BTW, существует другой важный, тонкий бит волшебства с <>. Скажите, что Вы хотите возвратить номер строки соответствия в файле. Вы могли бы думать, хорошо, проверка perlvar и найти $. дает linenumber в последнем дескрипторе, к которому получают доступ - большой. Но существует проблема, скрывающаяся здесь-$. не сбрасывается между @ARGV файлы. Здорово, если Вы хотите знать, сколько общего количества строк Вы обработали, но не, если Вы хотите номер строки для текущего файла. К счастью, существует простой прием с eof это решит эту проблему.

use strict;
use warnings;

...

searchDir( 'foo' );

sub searchDir {
    my $dirN    = shift;
    my $pattern = shift;

    local $_;

    my @fileList = grep { -f $_ } glob("$dirN/*");

    return unless @fileList;  # Don't want to process STDIN.

    local @ARGV;

    @ARGV = @fileList;
    while(<>) {
        my $found = 0;
        ## Search for pattern
        if ( $found ) {
            print "Match at $. in $ARGV\n";
        }
    }
    continue {
        # reset line numbering after each file.
        close ARGV  if eof;  # don't use eof().
    }
}

ПРЕДУПРЕЖДЕНИЕ: Я просто изменил Ваш код в своем браузере. Я не выполнил его так он, могу иметь опечатки и вероятно не буду работать без небольшого количества тонкой настройки

Обновление: причина использовать local вместо my это, они делают совсем другие вещи. my создает новую лексическую переменную, которая только видима в содержавшем блоке и не может быть получена доступ через таблицу символов. local сохраняет существующую переменную пакета и искажает его к новой переменной. Новая локализованная версия видима в любом последующем коде, пока мы не оставляем блок включения. См. perlsub: Временные ценности Через локальный ().

В общем случае создания новых переменных и использования их, my верный выбор. local является соответствующим, когда Вы работаете с globals, но Вы хотите удостовериться, что Вы не распространяете свои изменения в остальной части программы.

Этот короткий сценарий демонстрирует локальный:

$foo = 'foo';

print_foo();
print_bar();
print_foo();

sub print_bar {
    local $foo;
    $foo = 'bar';
    print_foo();
}

sub print_foo {
    print "Foo: $foo\n";
}
0
ответ дан 18 December 2019 в 13:20
поделиться
Другие вопросы по тегам:

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