Как я могу использовать значение переменной в качестве шаблона шарика в Perl?

В Perl можно получить список файлов, которые соответствуют шаблону:

my @list = <*.txt>;
print  "@list";

Теперь, я хотел бы передать шаблон как переменную (потому что он передается в функцию). Но это не работает:

sub ProcessFiles {
  my ($pattern) = @_;
  my @list = <$pattern>;
  print  "@list";
}

readline() on unopened filehandle at ...

Какие-либо предложения?

5
задан brian d foy 26 February 2010 в 01:56
поделиться

4 ответа

Не знаю, возможно ли это в более общем плане, но это возможно, если у вас есть собственный пользовательский MEYnnotationView.

Мне удалось адаптировать подход, задокументированный в http://spitzkoff.com/craig/?p=108 Крейгом Спицкоффом:

  1. Предоставьте пользовательскую MEYnnotationView ссылку на объект MEYnnotation
  2. Добавьте метод (а) к объекту MIAnnotation и вызову при необходимости изменения местоположения аннотации
  3. Вызов regionChanged на пользовательском MEYnnotationView, чтобы сообщить ему, когда для изменения положения (например, когда Обновление MEYnnotation координаты)
  4. На чертеже Rect на внутренний объект представления, принадлежащий настраиваемое представление MEYnnotationView изменить положение с помощью координат MIAnnotation (вы держите ссылка на него).

Этот подход, скорее всего, можно упростить еще больше - при любых обстоятельствах может не потребоваться внутренний объект представления.

-121--1264671-

Ваш вопрос неясен.

При попытке читать запрос HttpWebRequest поток после того, как другой кодекс написал потоку (ПОЧТОВЫЙ запрос), это не возможно. (Поток посылается непосредственно на сервер и не сохраняется в памяти)

Вместо этого вам потребуется открыть собственный MemureStream, а затем записать его в поток просить, который вы готовы отправить.

-121--2964740-

Используйте glob :

use strict;
use warnings;

ProcessFiles('*.txt');

sub ProcessFiles { 
  my ($pattern) = @_; 
  my @list = glob $pattern;
  print  "@list"; 
} 

Вот объяснение, почему вы получаете предупреждение, от операторов ввода/вывода :

Если угловые скобки содержат простая скалярная переменная (например, $ foo), то эта переменная содержит имя вводимой дескриптора файла от... считается более чистым называть внутреннюю функцию непосредственно как glob ($ foo), что, вероятно, является правильным способом сделать это в первую очередь.)

12
ответ дан 13 December 2019 в 19:26
поделиться
use File::Basename;
@ext=(".jpg",".png",".others");
while(<*>){
 my(undef, undef, $ftype) = fileparse($_, qr/\.[^.]*/);
 if (grep {$_ eq $ftype} @ext) {
  print "Element '$ftype' found! : $_\n" ;
 }
}
0
ответ дан 13 December 2019 в 19:26
поделиться

Как насчет обернуть это командой "eval"? Например, так...

sub ProcessFiles {
  my ($pattern) = @_;
  my @list;
  eval "\@list = <$pattern>";
  print @list;
}
-1
ответ дан 13 December 2019 в 19:26
поделиться

Почему бы не передать в функцию ссылку на массив списка файлов?

my @list = <*.txt>;
ProcessFiles(\@list);

sub ProcessFiles {
    my $list_ref = shift;
    for my $file ( @{$list_ref} ) {
        print "$file\n";
    }
}
0
ответ дан 13 December 2019 в 19:26
поделиться
Другие вопросы по тегам:

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