Re: Difficulty with patterns

*To*: mathgroup at smc.vnet.net*Subject*: [mg122315] Re: Difficulty with patterns*From*: A Retey <awnl at gmx-topmail.de>*Date*: Tue, 25 Oct 2011 06:15:44 -0400 (EDT)*Delivered-to*: l-mathgroup@mail-archive0.wolfram.com*References*: <j80qbl$ae1$1@smc.vnet.net>

Hi, > I have recently become increasingly uncomfortable with my areas of > ignorance with Mathematica. The Virtual conference has some really > cool demos. In one, a website is read in and a table of data > extracted. Without patterns, it would have been very difficult. > Need a little help with an example. > > Example 1 uses my old standby, the Table[] function. Works fine. I > am attempting to get better with patterns, so I tried example 2 and > 3. They work, but gives several errors about use of stringjoin > needing strings. What am I doing wrong? > > Error: StringJoin::string: String expected at position 1 in > StringJoin[n]. > > (* Load string from WolframAlpha *) m > WolframAlpha["usa",{{"LargestCities:CountryData",1},"ComputableData"}, >PodStates-> > {"LargestCities:CountryData__More","LargestCities:CountryData__More"} > ]; > > (* example 1 *) mNew=Flatten[m,1]; mNew=Drop[mNew,1]; > mNew=Drop[mNew,-1]; mNew=Table[{i[[1,1]]<> i[[1,2]]<> i[[1,2]] > ,i[[2]]},{i,mNew}]; Grid[mNew,Frame->All] > > (* example 2 *) Clear[n,o,p,q]; mNew=Cases[m, > {{n_String,o_String,p_String},q_} -> { n<> ", "<> o<> ", "<> > p,q},Infinity ]; Grid[mNew,Frame->All] > > (* example 3 *) Clear[n,o,p,q]; mNew=Cases[m, {{n_,o_,p_},q_} -> { n > , ", ", o , ", ", p,q},Infinity ]; mNew = mNew /. {n___,q_Integer} > -> {StringJoin[n],q}; Grid[mNew,Frame->All] > > I even tried, mNew = Flatten[m, 1]; mNew = Drop[mNew, 1]; mNew = > Drop[mNew, -1]; mNew = Table[{Head[i[[1, 1]]], Head[i[[1, 2]]], Head[ > i[[1, 2]]] , i[[2]]}, {i, mNew}]; (*mNew=Table[{i[[1,1]]<> > i[[1,2]]<> i[[1,2]] ,i[[2]]},{i,mNew}];*) Grid[mNew, Frame -> All] > > They are all strings! that's not the problem, also you problem is not with patterns but with evaluation: when using -> (Rule) the RHS is evaluated before the pattern matching actually is started. The error message comes from string-joining the symbols n,o, and p. You want the RHS only to be evaluated when the pattern matches, so you will need RuleDelayed (:>) and all is good, e.g. for example 2: Clear[n, o, p, q]; mNew = Cases[ m, {{n_String, o_String, p_String}, q_} :> {n <> ", " <> o <> ", " <> p, q}, Infinity]; Grid[mNew, Frame -> All] hth, albert