Там некоторый путь состоит в том, чтобы сделать переменные как $a и $b в отношении строгого?

Итак, Connection Reset означает, что розетка была закрыта с другого конца. Это вполне логично, если учесть, что делает ваш «сервер».

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

Вы должны проверить, успешно ли написано testfile.txt. Это может быть , может быть в порядке, хотя я бы не стал так внезапно отключать сервер. Я бы позволил клиенту изящно закрыться или тайм-аут соединения с клиентом после бездействия, потому что вы можете рискнуть получить ошибку Connection Reset перед чтением всех данных из буферов TCP. (Ошибки TCP, как правило, передаются быстрее.)

5
задан 6 revs, 3 users 97% 8 October 2008 в 06:57
поделиться

13 ответов

Если я понимаю Ваш вопрос, Вы хотите записать модуль, который объявляет переменные в пространстве имен пользователя (таким образом, они не имеют к), и который локализуется автоматически в обратных вызовах. Это правильно?

Можно сделать это путем объявления globals и экспорта их. (Хотя действительно отмечают, что это обычно полагало, что невоспитанность экспортирует вещи, не будучи спрошенным к.)

package Foo;
use strict;
use warnings;

require Exporter;
our @ISA    = qw(Exporter);
our @EXPORT = qw(*k *v hashmap);
our ($k, $v);

sub hashmap(&\%) {
    my $code = shift;
    my $hash = shift;

    while (local ($k, $v) = each %$hash) {
        $code->();
    }
}

Примечание: Экспорт имеет *k и *v, нет $k и $v. Если Вы не экспортируете весь typeglob local в hashmap не будет работать правильно от пакета пользователя. Побочный эффект этого состоит в том что все различные формы k и v (%k, @v, и т.д.), объявляются и исказил. Для полного объяснения этого посмотрите Таблицы символов в perlmod.

Затем в Вашем сценарии:

use Foo; # exports $k and $v

my %h = (a => 1, b => 2, c => 3);

hashmap { print "$k => $v\n" } %h;

__END__
c => 3
a => 1
b => 2
2
ответ дан 18 December 2019 в 07:11
поделиться

Другие упомянули, как 'использовать Вар' и 'наш' - я просто хотел добавить, что $a и $b являются особыми случаями, так как они используются внутренне программами сортировки. Вот примечание из strict.pm документов:

Because of their special use by sort(), the variables $a and $b are 
exempted from this check.
7
ответ дан 18 December 2019 в 07:11
поделиться

Если я понимаю правильно, что Вы хотите:

use vars qw($a $b); # Pre-5.6

или

our ($a, $b); # 5.6 +

Можно читать об этом здесь.

4
ответ дан 18 December 2019 в 07:11
поделиться

$a и $b являются особенными, потому что они - часть базового языка. В то время как я вижу, почему Вы могли бы сказать, что неспособность создать собственные так-же-специальные-переменные является anti-TIMTOWTDI, я сказал бы, что это больше не, чем неспособность создать новые основные команды на порядке 'печати' или 'вида'. (Можно определить нижние индексы в модулях, но это не делает их истинными ключевыми словами. Это - эквивалент использования 'нашего $k', который Вы, кажется, говорите, не делает $k достаточно как $a для Вас.)

Для продвижения имен в чужое пространство имен это должно быть рабочим примером Средства экспорта:

package SpecialK;

use strict;

use base 'Exporter';
BEGIN {
  our @EXPORT = qw( $k );
}

our $k;

1;

Сохраните это к SpecialK.pm и 'использует SpecialK', должен затем сделать $k доступным для Вас. Обратите внимание, что только 'наши' переменные могут быть экспортированы, не 'мой'.

4
ответ дан 18 December 2019 в 07:11
поделиться

В Perl 5.6 и позже, можно использовать наш:

our ($k, $v);

Или можно продолжить работать с более старым "использованием Вар":

use vars qw($k $v);

Или Вы могли бы просто придерживаться "моего", например:

my %hash;
my ($k,$v);
while (<>) {
  /^KEY=(.*)/ and $k = $1 and next;
  /^VALUE=(.*)/ and $v = $1;
  $hash{$k} = $v;
  print "$k $v\n";
}

__END__
KEY=a
VALUE=1
KEY=b
VALUE=2

Создание глобального $v не действительно необходимо в примере выше, но надо надеяться Вы получаете идею ($k, с другой стороны, должен быть ограничен по объему вне в то время как блок).

С другой стороны, можно использовать полностью определенные имена переменной:

$main::k="foo";
$main::v="bar";
%main::hash{$k}=$v;
2
ответ дан 18 December 2019 в 07:11
поделиться

Это работало на меня:

package Special;
use base qw<Exporter>;
# use staging; -> commented out, my module for development
our $c;

our @EXPORT = qw<manip_c>;

sub import { 
    *{caller().'::c'} = *c;
    my $import_sub    = Exporter->can( 'import' );
    goto &$import_sub;
 } 

И это передает $c через строгий, также.

package main;
use feature 'say';
use strict;
use Special;
use strict;
say "In main: \$c=$c";

manip_c( 'f', sub {
    say "In anon sub: \$c=$c\n"; # In anon sub: $c=f
});

say "In main: \$c=$c";

Да, это является довольно немым, что я заключил в скобки свои модули с "использованием, строгим", но я не знаю внутренности, и это заботится о потенциальных проблемах упорядочивания.

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

Это кажется, что Вы хотите сделать вид волшебства это List::MoreUtils делает:

use strict;
my @a = (1, 2);
my @b = (3, 4);
my @x = pairwise { $a + $b } @a, @b;

Я предложил бы просто смотреть на pairwise sub в List::MoreUtils источник. Это использует некоторую умную таблицу символов, играющую для введения $a и $b в пространство имен вызывающей стороны и затем локализуют их к только в sub теле. Я думаю.

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

$a и $b просто глобальные переменные. Можно достигнуть подобных эффектов путем простого объявления $k и $v:

use strict;
our ($k, $v);

(В этом случае $k и $v не глобальные переменные, но лексически ограниченные по объему псевдонимы для переменных пакета. Но если Вы не пересекаете границы, это так же достаточно.)

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

$a и $b не являются нормальными переменными, тем не менее, и не могут легко копироваться или лексическими объявлениями или явным экспортом или имением предосудительные отношения с таблицей символов. Например, с помощью отладчика в качестве оболочки:

  DB<1> @foo = sort { $b cmp $a } qw(foo bar baz wibble);

  DB<2> x @foo
0  'wibble'
1  'foo'
2  'baz'
3  'bar'
 DB<3> x $a
0  undef
  DB<4> x $b
0  undef

$a и $b только существуют в блоке, переданном виду (), не существуйте впоследствии и имейте объем таким способом, которым дальнейшие вызовы к виду не наступают на них.

Для тиражирования этого, вероятно, необходимо начать иметь предосудительные отношения с фильтрами источника, поворачивать предпочтительную нотацию

my %starts_upper_1_to_25 
    = skim { $k =~ m/^\p{IsUpper}/ && ( 1 <= $v && $v <= 25 ) } %my_hash
;

в эффективно

my %starts_upper_1_to_25
    = map { my $k = $_; my $v = $my_hash{$v};
            $k =~ m/^\p{IsUpper}/ && ( 1 <= $v && $v <=> 25 ) } keys %my_hash
;

$a и $b являются столь же особенными как $ _ и _, и в то время как нет никакого простого способа изменить те имена в Perl 5, Perl 6 действительно фиксирует это с данным ключевым словом. "данный" мусорный термин для поиска на, но http://dev.perl.org/perl6/doc/design/syn/S03.html может быть хорошим местом для запуска.

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

Я не уверен, разъяснил ли кто-либо, что это, но строгий не добавляет в белый список $a и $b просто, потому что они - действительно удобные имена переменной для Вас для использования в собственных стандартных программах. $a и $b имеют особое значение для оператора вида. Это хорошо с точки зрения в рамках такой программы сортировки, но вида плохого дизайна снаружи.:) Вы не должны использовать $a и $b в других контекстах, если Вы.

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

Это что Ваш после?.....

use strict;
use warnings;
use feature qw/say/;

sub hash_baz (&@) {
    my $code   = shift;  
    my $caller = caller;
    my %hash   = (); 
    use vars qw($k $v);

    no strict 'refs';
    local *{ $caller . '::k' } = \my $k;
    local *{ $caller . '::v' } = \my $v;

    while ( @_ ) {
        $k = shift;
        $v = shift;
        $hash{ $k } = $code->() || $v;
    }

    return %hash;
}

my %hash = ( 
    blue_cat   => 'blue', 
    purple_dog => 'purple', 
    ginger_cat => 'ginger', 
    purple_cat => 'purple' );

my %new_hash = hash_baz { uc $v if $k =~ m/purple/ } %hash;

say "@{[ %new_hash ]}";

# =>  purple_dog PURPLE ginger_cat ginger purple_cat PURPLE blue_cat blue
1
ответ дан 18 December 2019 в 07:11
поделиться

Модули предположили, что экспорт использования действительно не отличается от use vars. Но use vars должен был бы быть сделан в каждом пакете, который использовал переменную $a-like. И our() должен был бы быть сделан в каждом внешнем объеме.

Обратите внимание, что можно избегать использования $a, и $b даже для вида при помощи $$ - моделировал sub:

sub lccmp($$) { lc($_[0]) cmp lc($_[1]) }
print join ' ', sort lccmp
   qw/I met this guy and he looked like he might have been a hat-check clerk/;

Это важно при использовании сравнить стандартной программы в другом пакете, чем вызов вида.

0
ответ дан 18 December 2019 в 07:11
поделиться

РЕДАКТИРОВАНИЕ - это на самом деле неправильно, см. комментарии. Отъезд его здесь, чтобы дать другим людям шанс научиться на моей ошибке :)


О, Вы спрашиваете, существует ли путь к модулю для объявления $k и $v в пространстве имен ВЫЗЫВАЮЩЕЙ СТОРОНЫ? Можно использовать Средство экспорта для увеличивания переменных вызывающей стороне:

use strict;

package Test; 
use Exporter;

my @ISA = qw/Exporter/; 
my $c = 3; 
my @EXPORT = qw/$c/; 

package main; 
print $c;
-3
ответ дан 18 December 2019 в 07:11
поделиться
Другие вопросы по тегам:

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