{"id":843,"date":"2022-02-09T07:34:12","date_gmt":"2022-02-09T06:34:12","guid":{"rendered":"https:\/\/esferas.org\/mldt\/?p=843"},"modified":"2022-02-09T07:54:35","modified_gmt":"2022-02-09T06:54:35","slug":"tareas-martes-8-de-febrero-de-2022","status":"publish","type":"post","link":"https:\/\/esferas.org\/mldt\/tareas-martes-8-de-febrero-de-2022\/","title":{"rendered":"Tareas: martes, 8 de febrero de 2022"},"content":{"rendered":"\n<p>Resuelto el problema de la depuraci\u00f3n en Perl.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h3 class=\"wp-block-heading\" id=\"depuracion-en-perl\">Depuraci\u00f3n en Perl<\/h3>\n\n\n\n<p>Ayer habl\u00e9 del problema molesto y un tanto est\u00fapido de que al usar el m\u00f3dulo <em>Devel::pktdb <\/em>para depurar programas algunos par\u00e1metros de entrada desaparec\u00edan antes de comenzar la ejecuci\u00f3n. Esta ma\u00f1ana, m\u00e1s descansado, he recordado que en los <em>toolkits <\/em> gr\u00e1ficos en UNIX era bastante habitual aceptar par\u00e1metros para definir cosas como la geometr\u00eda, el nombre de la ventana y otros aspectos de la aplicaci\u00f3n gr\u00e1fica. \u00bf Pod\u00eda ser \u00e9ste el caso  ? Puedes apostar tu vida a que s\u00ed. <\/p>\n\n\n\n<p>Busqu\u00e9 entonces en la documentaci\u00f3n y nada de nada. Todos parecen darlo por sentado por lo que al final he tenido que mirar los fuentes. El m\u00f3dulo <em>Tk.pm<\/em> que emplea el depurador gr\u00e1fico <em>Devel::ptkdb<\/em> carga otros m\u00f3dulos y en ellos se realizan efectivamente la b\u00fasqueda y extracci\u00f3n de par\u00e1metros para configurar dichos aspectos gr\u00e1ficos. <\/p>\n\n\n\n<p>En el m\u00f3dulo <em>Tk::CmdLine <\/em>aparece lo siguiente:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sub SetArguments # Tk::CmdLine::SetArguments([@argument])\n{\n   ...\n    my @option = ();\n  while ($self-&gt;{offset} &lt; @{$self-&gt;{argv}})\n    {\n        last if ($self-&gt;{argv}-&gt;[$self-&gt;{offset}] <strong>eq '--'<\/strong>);\n        unless (\n            (($self-&gt;{argv}-&gt;[$self-&gt;{offset}] =~ <strong>\/^-{1,2}(\\w+)$\/) <\/strong> &amp;&amp; (@option = $1)) ||\n            (($self-&gt;{argv}-&gt;[$self-&gt;{offset}] =~ <strong>\/^--(\\w+)=(.*)$\/)<\/strong> &amp;&amp; (@option = ($1, $2))))\n        {\n            ++$self-&gt;{offset};\n            next;\n        }\n<\/pre>\n\n\n\n<p>Comprueba la existencia del literal <em>&#8212;<\/em> y no la encuentra almacena opciones en una lista que ser\u00e1n procesadas m\u00e1s adelante por otras funciones y eliminadas de <em>@ARGV<\/em>.<\/p>\n\n\n\n<p>As\u00ed que s\u00ed, era un problema que hab\u00eda saltado porque empleaba nombres de par\u00e1metros reconocibles por la parte gr\u00e1fica. Podr\u00eda haber sido antes con <em>&#8211;geometry<\/em> o algo similar pero no he tenido esa <em>suerte<\/em>. Como no tengo tiempo de tomar otro camino he terminado por consultar la documentaci\u00f3n del m\u00f3dulo <em>Getopt::Long<\/em> y he visto que se puede establecer un rodeo. <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">use Getopt::Long qw(<strong>GetOptionsFromArray<\/strong>);\n...\nGetopt::Long::Configure( qw( auto_version auto_help )  );\nmy @MyARGV = @ARGV; \nshift @MyARGV if $MyARGV[0] eq '--';\n\n<strong>GetOptionsFromArray<\/strong>( \\@MyARGV,\n            'name=s'        =&gt;  \\$project,\n            'init'          =&gt;  sub { $operation = q(init); }, \n  <\/pre>\n\n\n\n<p>Esto es, analizar los par\u00e1metros empleando una lista personalizada de la que hemos eliminado el primer par\u00e1metro si coincide con <em>&#8212;<\/em>. As\u00ed puedo seguir depurando sin m\u00e1s tiranteces y como lo he dejado documentado podr\u00e9 corregirlo en el futuro. <\/p>\n\n\n\n<p>Eso me ha hecho replantearme que las herramientas que empleo son bastante antiguas. No me sienta bien reconocer que puedo estar qued\u00e1ndome <em>obsoleto<\/em> de alguna manera, pero voy a dejarlo aparcado porque tengo suficiente peso a las espaldas para a\u00f1adir m\u00e1s. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Resuelto el problema de la depuraci\u00f3n en Perl.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"webmentions_disabled_pings":false,"webmentions_disabled":false,"footnotes":""},"categories":[121],"tags":[145,239,240,180],"class_list":["post-843","post","type-post","status-publish","format-standard","hentry","category-el-dia-a-dia","tag-desarrollo","tag-develptkdb","tag-getoptlong","tag-perl","content-box"],"_links":{"self":[{"href":"https:\/\/esferas.org\/mldt\/wp-json\/wp\/v2\/posts\/843","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/esferas.org\/mldt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/esferas.org\/mldt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/esferas.org\/mldt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/esferas.org\/mldt\/wp-json\/wp\/v2\/comments?post=843"}],"version-history":[{"count":2,"href":"https:\/\/esferas.org\/mldt\/wp-json\/wp\/v2\/posts\/843\/revisions"}],"predecessor-version":[{"id":846,"href":"https:\/\/esferas.org\/mldt\/wp-json\/wp\/v2\/posts\/843\/revisions\/846"}],"wp:attachment":[{"href":"https:\/\/esferas.org\/mldt\/wp-json\/wp\/v2\/media?parent=843"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/esferas.org\/mldt\/wp-json\/wp\/v2\/categories?post=843"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/esferas.org\/mldt\/wp-json\/wp\/v2\/tags?post=843"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}