[l-desarrollo] Pasar parámetros a un objeto en Perl

4 views
Skip to first unread message

Alberto Mijares

unread,
Sep 20, 2012, 12:55:54 AM9/20/12
to Aplicaciones y Desarrollo en Linux
Hola lista:

Estoy trabajando con el módulo Video::Capture::V4l.

Por defecto, un nuevo objeto se instancia usando el dispositivo
/dev/video0, pero estoy viendo el constructor de la clase para saber
cómo indicarle que use otro dispositivo y no encuentro la forma. Hay
muy poca documentación al respecto. El constructor es

sub new (;$) {
my $class = shift;
my $device = shift || "/dev/video0";
my $self = bless { device => $device }, $class;

[...]
}

He intentado cosas como

$grab = new Video::Capture::V4l('/dev/video1');

y

$grab = new Video::Capture::v4l(device => '/dev/video1');

pero no funciona.

Estuve leyendo perldoc persub y perldoc -f sub para ver si encontraba
la explicación de algo especial que veo en el constructor:

sub new (;$) {...}

pero no encuentro una explicación directa.

Gracias de antemano por sus comentarios.

Saludos


Alberto Mijares
_______________________________________________
l-desarrollo mailing list
l-desa...@velug.org.ve
http://listas.velug.org.ve/mailman/listinfo/l-desarrollo

Ernesto Hernández-Novich

unread,
Sep 20, 2012, 12:19:58 PM9/20/12
to Aplicaciones y Desarrollo en Linux
On Thu, 2012-09-20 at 00:25 -0430, Alberto Mijares wrote:
> Hola lista:
>
> Estoy trabajando con el módulo Video::Capture::V4l.
>
> Por defecto, un nuevo objeto se instancia usando el dispositivo
> /dev/video0, pero estoy viendo el constructor de la clase para saber
> cómo indicarle que use otro dispositivo y no encuentro la forma. Hay
> muy poca documentación al respecto. El constructor es
>
> sub new (;$) {
> my $class = shift;
> my $device = shift || "/dev/video0";
> my $self = bless { device => $device }, $class;
>
> [...]
> }
>
> He intentado cosas como
>
> $grab = new Video::Capture::V4l('/dev/video1');

Esa es una manera correcta de hacerlo.

> $grab = new Video::Capture::v4l(device => '/dev/video1');

Esta no es una manera correcta de hacerlo, porque el fragmento de código
que estás mostrando no está preparado para procesar una lista
clave/valor.

Otra manera de hacerlo es

my $grab = Video::Capture::V4l->new('/dev/video1');

A menos que haya otro fragmento de código que altere el atributo
'device' más adelante, no hay otra razón para que no funcione (la
asignación al atributo -- que /dev/video1 *exista*, sea *accesible*,
etc. no es problema de Perl).

> Estuve leyendo perldoc persub y perldoc -f sub para ver si encontraba
> la explicación de algo especial que veo en el constructor:
>
> sub new (;$) {...}

Se llaman prototipos y en general no los quieres usar. El manual
adecuado es perlsub, sección "Prototypes". La declaración particular que
te llama la atención tiene la intención de que *puedas* llamar a la
función new sin poner los paréntesis alrededor del único argumento
opcional.
--
Ernesto Hernández-Novich - @iamemhn - Unix: Live free or die!
Geek by nature, Linux by choice, Debian of course.
If you can't aptitude it, it isn't useful or doesn't exist.
GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3

Alberto Mijares

unread,
Sep 20, 2012, 12:55:02 PM9/20/12
to emhn...@gmail.com, Aplicaciones y Desarrollo en Linux
>> $grab = new Video::Capture::V4l('/dev/video1');
>
> Esa es una manera correcta de hacerlo.
>
>> $grab = new Video::Capture::v4l(device => '/dev/video1');
>
> Esta no es una manera correcta de hacerlo, porque el fragmento de código
> que estás mostrando no está preparado para procesar una lista
> clave/valor.


Claro, pero como no me funcionaba me puse a tirar flechas. Además, no
conocía los prototipos y en mi ignorancia pensé cualquier cosa.

> A menos que haya otro fragmento de código que altere el atributo
> 'device' más adelante, no hay otra razón para que no funcione (la
> asignación al atributo -- que /dev/video1 *exista*, sea *accesible*,
> etc. no es problema de Perl).
>


Todo eso fue verificado. Estoy sospechando de un mal funcionamiento
del driver que maneja la capturadora de video, que en este caso es
tw68; pero ciertamente, eso no es problema de Perl ;-)


>> sub new (;$) {...}
>
> Se llaman prototipos y en general no los quieres usar. El manual
> adecuado es perlsub, sección "Prototypes". La declaración particular que
> te llama la atención tiene la intención de que *puedas* llamar a la
> función new sin poner los paréntesis alrededor del único argumento
> opcional.


Gracias. Leeré más al respecto. No me había hecho falta porque para
crear mis clases uso M[oa]ose.

Saludos


Alberto Mijares

Reply all
Reply to author
Forward
0 new messages