On 6/15/11 Wed  Jun 15, 2011  8:20 AM, "Rob Dixon" <rob.di...@gmx.com>
scribbled:

> On 15/06/2011 16:02, Jim Gibson wrote:
>> At 12:38 PM +0100 6/15/11, Rob Dixon wrote:
>>> On 15/06/2011 12:10, Paul Johnson wrote:
>>>> On Tue, Jun 14, 2011 at 11:56:04PM -0700, Beware wrote:
>>>>> Hi
>>>>> 
>>>>> Sorry, i've been tired these past days.
>>>>> 
>>>>> So, this is what i want to do :
>>>>> 
>>>>> I've source code files in VHDL. I want to check that all specific
>>>>> keywords of this language are in uppercase.
>>>>> 
>>>>> In fact, in my current script i read this file line per line and
>>>>> check others rules.
>>>>> 
>>>>> Am i clear, now?
>>>> 
>>>> Here is some code that does this. I suggest you make sure you
>>>> understand what
>>>> it does and check that it is correct. Call it by passing the names of
>>>> your
>>>> VHDL files.
>>>> 
>>>> Note that this code isn't very clever. In particular you will get false
>>>> positives. To do the job properly you would need a VHDL parser. For that
>>>> reason I would suggest against modifying the code to alter the input
>>>> file as
>>>> part of a checkin hook, for example.
>>>> 
>>>> (I prefer my keywords to be in lowercase.)
>>>> 
>>>> 
>>>> #!/usr/bin/perl
>>>> 
>>>> use strict;
>>>> use warnings;
>>>> 
>>>> my @keywords = qw
>>>> (
>>>> abs access after alias all and architecture array assert attribute begin
>>>> block body buffer bus case component configuration constant disconnect
>>>> downto else elsif end entity exit file for function generate generic
>>>> group
>>>> guarded if impure in inertial inout is label library linkage literal
>>>> loop
>>>> map mod nand new next nor not null of on open or others out package port
>>>> postponed procedure process pure range record register reject return rol
>>>> ror select severity signal shared sla sli sra srl subtype then to
>>>> transport type unaffected units until use variable wait when while with
>>>> xnor xor
>>>> );
>>>> 
>>>> my $kw = join "|", @keywords;
>>> 
>>> You would need
>>> 
>>> my $kw = join "|", map uc, @keywords;
>> 
>> 
>> Why? He is using the 'i' modifier in the regular expression to find all
>> keywords regardless of case (lower, upper, mixed). Then checking to see
>> if the extracted keyword is equal to the upper-case version and printing
>> a warning message if it is not.
> 
> Very true: I missed the uc within the loop and the code is fine as it
> stands. But it would be better to write, as John said
> 
>    my $kw = uc join "|", @keywords;
> 
> and drop the call inside the loop.
> 
>    warn "Keyword '$w' not uppercase at $ARGV:$.\n" unless $w eq $w;
> 

I am afraid that will not work. $w is extracted from the input line and may
contain lower-case letters. You must compare $w to uc $w to see if it
contains any lower-case letters. '$w eq $w' is always true.


>>> 
>>>> while (<>)  {
>>>>   for my $w (/(\b$kw\b)/ig) {
>>>>     warn "Keyword '$w' not uppercase at $ARGV:$.\n" unless $w eq uc $w;
>>>>   }
>>>> }



-- 
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to