Там какой-либо путь состоит в том, чтобы использовать “константу” в качестве ключа хеша в Perl?

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

Для этого просто используйте обработчик события load вашего элемента :

// create a new image
var img = new Image();
// declare a function to call once the image has loaded
img.onload = function(){
  var canvas = document.createElement('canvas');
  canvas.width = img.width;
  canvas.height = img.height;
  var context = canvas.getContext('2d');
  context.drawImage(img, 0,0);
  var dataURL = canvas.toDataURL();
  // now you can do something with the dataURL
  doSomething(dataURL);
}
// now set the image's src
img.src = "http://somerandomWebsite/picture.png";

Кроме того, для холста 'context.toDataURL() и context.getImageData для работайте правильно, вы должны получить свой ресурс изображения в соответствии с кросс-оригинальным способом , в противном случае холст «испорчен», что означает, что любой метод получения данных с пикселями будет заблокирован.

  • Если ваше изображение поступает с одного и того же сервера, нет проблем.
  • Если ваше изображение подано с внешнего сервера, убедитесь, что оно позволяет вашим в своих кросс-начальных заголовках и установить img.crossOrigin на "use-credentials".
  • Если сервер разрешает анонимные запросы, вы можете установить img.crossOrigin на "anonymous".

Nota Bene : Сервер CORS отправляется сервером, а атрибут cross-origin сообщает, что вы хотите использовать CORS для получения данных изображения, и вы не сможете обойти его, если сервер установлен неправильно. Кроме того, некоторые UserAgents (IE & amp; Safari) до сих пор не реализовали этот атрибут.

Edge Case : Если некоторые из ваших изображений находятся на вашем сервере, а некоторые из них соответствуют требованиям CORS один, тогда вы можете захотеть использовать обработчик события onerror, который должен срабатывать, если вы установите атрибут cross-origin на "anonymous" на сервере без CORS.

function corsError(){
  this.crossOrigin='';
  this.src='';
  this.removeEventListener('error', corsError, false);
} 
img.addEventListener('error', corsError, false);

31
задан 3 revs, 2 users 100% 8 October 2008 в 07:09
поделиться

9 ответов

use constant на самом деле делает постоянные подпрограммы.

, Чтобы сделать, что Вы хотите, необходимо явно назвать sub:

use constant X => 1;

my %x = ( &X => 'X');

или

use constant X => 1;

my %x = ( X() => 'X');
48
ответ дан 27 November 2019 в 19:52
поделиться

Другая опция не состоит в том, чтобы использовать использование постоянная прагма и зеркальное отражение к Только для чтения согласно рекомендациям в Лучших практиках Perl Damian Conway.

я переключился некоторое время назад после понимания, что постоянный ref's хеша является просто постоянной ссылкой на хеш, но ничего не делает о данных в хеше.

синтаксис только для чтения создает "нормально выглядящие" переменные, но на самом деле осуществит постоянность или только для чтения. Можно использовать его точно так же, как Вы были бы любая другая переменная как ключ.


use Readonly;

Readonly my $CONSTANT => 'Some value';

$hash{$CONSTANT} = 1;

19
ответ дан 27 November 2019 в 19:52
поделиться

Ваша проблема состоит в том, что => волшебная запятая, которая автоматически заключает слово в кавычки перед ним. Таким образом, то, что Вы записали, эквивалентно ('X', 'X').

самый простой путь состоит в том, чтобы просто использовать запятую:

my %x = (X, 'X');

Или, можно добавить различную пунктуацию так, чтобы у Вас больше не было простого слова перед =>:

my %x = ( X() => 'X' );
my %x = ( &X => 'X' );
14
ответ дан 27 November 2019 в 19:52
поделиться

Используйте $hash{CONSTANT()} или $hash{+CONSTANT}, чтобы препятствовать тому, чтобы bareword заключил механизм в кавычки умереть.

От: http://perldoc.perl.org/constant.html

9
ответ дан 27 November 2019 в 19:52
поделиться

Большинство других людей ответило на Ваш вопрос хорошо. Взятый вместе, они создают очень полное объяснение проблемы и рекомендуемые обходные решения. Проблема - то, что прагма Perl "использует постоянный", действительно создает подпрограмму в Вашем текущем пакете, имя которого является первым аргументом прагмы и чье значение является последним.

В Perl, когда-то подпрограмма объявляется, это можно назвать без parens.

Понимание, что "константы" являются просто подпрограммами, Вы видите, почему они не интерполированы в строках и почему "толстая запятая" оператор "=>", который заключает левый аргумент в кавычки, думает, что Вы вручили ему строку (попробуйте другие встроенные функции как время () и ключи () когда-то с толстой запятой для дополнительной забавы).

К счастью, можно вызвать постоянную использующую явную пунктуацию как parens или символ амперсанда.

Однако у меня есть вопрос для Вас: почему Вы используете константы для ключей хеша вообще?

я могу думать о нескольких сценариях, которые могли бы привести Вас в этом направлении:

  1. Вы хотите управление, по которому ключи могут быть в хеше.

  2. Вы хотите абстрагировать название ключей в случае, если они изменяются позже

В случае номера 1, константы, вероятно, не сохранят Ваш хеш. Вместо этого рассмотрите создание Класса, который имеет общедоступные методы set и методы считывания, которые заполняют хеш, видимый только к объекту. Это очень неPerl как решение, но очень легко сделать.

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

Hope это помогает и спасибо за внимание.

6
ответ дан 27 November 2019 в 19:52
поделиться

use constant прагма создает подпрограмму, смоделированную для взятия аргументов. В то время как это взгляды как постоянный C-стиль, это - действительно подпрограмма, которая возвращает постоянное значение.

=> (толстая запятая) автоматически заключает оставленный операнд в кавычки, если это - bareword, как делает $hash {ключ} нотация.

, Если Ваше использование постоянного имени похоже на bareword, механизмы заключения в кавычки умрут, и Вы получите его имя как ключ вместо его значения. Для предотвращения этого измените использование так, чтобы это не был bareword. Например:

use constant X => 1;
%hash = (X() => 1);
%hash = (+X => 1);
$hash{X()} = 1;
$hash{+X} = 1;

В инициализаторах, Вы могли также использовать простую запятую вместо этого:

%hash = (X, 1);
5
ответ дан 27 November 2019 в 19:52
поделиться

Один путь состоит в том, чтобы инкапсулировать X как (X):

my %x ( (X) => 1 );

Другая опция состоит в том, чтобы покончить '=>' и использование'', вместо этого:

my %x ( X, 1 );
2
ответ дан 27 November 2019 в 19:52
поделиться

=> оператор интерпретирует свою левую сторону как "строку", способ, которым делает QW ().

Попытка с помощью

my %x = ( X, 'X');
2
ответ дан 27 November 2019 в 19:52
поделиться

Прокомментируйте @shelfoo (репутация не достаточно высоко для добавления комментария непосредственно там все же!)

Полностью согласовывают о Лучших практиках Perl Damian Conway... его наиболее рекомендуемое чтение.

Однако читайте Комментарий Рекомендации Модуля PBP, который является полезными "опечатками", если Вы планируете использовать PBP для внутреннего руководства по стилю.

1
ответ дан 27 November 2019 в 19:52
поделиться
Другие вопросы по тегам:

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